测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最新发布 | 2017年10月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 tokorom 维护。
==================
我们可以向 Swift 扩展添加一些存储对象
答案:不可以,但我们可以使用关联对象。
extension UIViewController: HasAssociatedObjects {
// new stored property
var storedString: String? {
get {
return associatedObjects.value as? String
}
set {
associatedObjects.value = newValue
}
}
}
extension UIViewController: HasAssociatedObjects {
var storedString: String? {
get {
return associatedObjects["STRING"] as? String
}
set {
associatedObjects["STRING"] = newValue ?? ""
}
}
var storedInt: Int {
get {
guard let value = associatedObjects["INT"] as? Int else {
return 0 //< default value
}
return value
}
set {
associatedObjects["INT"] = newValue
}
}
}
extension Subject: HasAssociatedObjects {
}
subject.associatedObjects.value = 10
let storedValue = subject.associatedObjects.value as? Int
XCTAssertEqual(10, storedValue)
// subject is struct
struct AnySubject {
let identifier: Int
}
// a appropriate property that can be cleaned
var propertyOfSomeone: [Int: AssociatedObjects] = [:]
// You can customize `associatedObjects`
extension AnySubject: HasAssociatedObjects {
var associatedObjects: AssociatedObjects {
guard let associatedObjects = propertyOfSomeone[hashValue] else {
let associatedObjects = AssociatedObjects()
propertyOfSomeone[hashValue] = associatedObjects
return associatedObjects
}
return associatedObjects
}
}
extension AnySubject: Hashable {
var hashValue: Int {
return identifier
}
static func == (lhs: AnySubject, rhs: AnySubject) -> Bool {
return lhs.hashValue == rhs.hashValue
}
}