我以前从未使用过Swift4,也不知道如何在其中使用KVC。
我尝试用字典创建模型,代码如下:
class Person : NSObject {
var name: String = ""
var age: Int = 0
init(dict: [String : Any]) {
super.init()
self.setValuesForKeys(dict)
}
}
let dict: [String : Any] = ["name" : "Leon", "age" : 18]
let p = Person(dict: dict)
print(p.name, p.age)
我有两个问题:
1.为什么我不使用AnyObject
? "Leon"
and18
被推断为String
and Int
,它在KVC中使用吗?
2. @objc var name: String = ""
,这个表格是有效的,但我无法理解它。
感谢您的所有帮助。
要在 Swift 4 中实现对属性的 KVC 支持,您需要做两件事:
由于 KVC 当前的实现是用 Objective-C 编写的,因此您需要@objc
您的属性上的注释,以便 Objective-C 可以看到它。这也意味着属性的类型需要与 Objective-C 兼容。
除了向 Objective-C 公开属性之外,您还需要设置通知,以便在属性更改时通知观察者。有三种方法可以做到这一点:
对于存储的属性,最简单的方法是添加dynamic
关键字如下:
@objc dynamic var foo: String
这将允许 Cocoa 使用 Objective-C 魔法自动为您生成所需的通知,并且通常是您想要的。但是,如果您需要更精细的控制,您也可以手动编写通知代码:
@objc private static let automaticallyNotifiesObserversOfFoo = false
@objc var foo: String {
willSet { self.willChangeValue(for: \.foo) }
didSet { self.didChangeValue(for: \.foo) }
}
The automaticallyNotifiesObserversOf<property name>
属性的作用是向 KVC/KVO 系统表明我们正在自己处理通知,并且 Cocoa 不应该尝试为我们生成通知。
最后,如果您的属性没有被存储,而是依赖于其他一些属性,那么您需要实现一个keyPathsForValuesAffecting<your property name here>
像这样的方法:
@objc dynamic var foo: Int
@objc dynamic var bar: Int
@objc private static let keyPathsForValuesAffectingBaz: Set<String> = [
#keyPath(foo), #keyPath(bar)
]
@objc var baz: Int { return self.foo + self.bar }
在上面的例子中,观察者baz
当值达到时,属性将被通知foo
或值bar
变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)