extension AppDelegate {
func testKeyPath() {
// testKVO()
testDog()
testCat()
}
func testKVO() {
let p = Person()
p.name = "0000"
self.p = p
let a = p.observe(\Person.name, options: NSKeyValueObservingOptions.new) { (person , change ) in
print("\(person.name ) , \(change)")
}
self.o = a
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 5) {
self.p.name = "xxxx"
}
}
func testDog() {
let dog = Dog()
let nameKeypath = \Dog.name // ReferenceWritableKeyPath<Dog, String>
let name = dog[keyPath : nameKeypath]
print("dog name is : \(name)")
SwiftUIUsage.testKeyPath(m: dog, s: \Dog.number )
}
func testCat() {
// KeyPath
let cat = Cat()
// setter(for: d, keyPath: \Dog.name)
let nameKeypath = \Cat.name // WritableKeyPath<Cat, String>
let name = cat[keyPath : nameKeypath]
let birthdayKeypath = \Cat.birthday // KeyPath<Cat, String>
let birthday = cat[keyPath : birthdayKeypath]
print("cat name is : \(name)")
print("cat birthday is : \(birthday)")
SwiftUIUsage.testKeyPath(m: cat, s: \Cat.name )
}
}
///另外一件事就是被观察的属性 需要用 dynamic 修饰 ,否则也无法观察到。
@objcMembers
class Person : NSObject {
///一定要加@objc dynamic 才能实现这个属性的kvo
///或者在类声明的时候 , 在class前加上@objcMembers 关键字 , 且在被观察的属性前加dynamic
// @objc dynamic
dynamic var name : String = "default dog"
}
func setter<Object: AnyObject, Value>( for object: Object, keyPath: ReferenceWritableKeyPath<Object, Value>
) -> (Value) -> Void {
return { [weak object] value in
object?[keyPath: keyPath] = value
}
}
class Dog : NSObject{
var name = "default"
var number = "dog's telephone number : 18818181818"
}
struct Cat {
var name = "default cat"
let birthday = "2019-11-11"
}
func testKeyPath<MMMM>(m : MMMM ,s : KeyPath<MMMM , String>) {
let exept = m[keyPath : s]
print(exept)
}
swift5 KVO KVC KeyPath
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 今天主要探究一些KVC几个方法的执行顺序。表面浅显的东西,其实也内有乾坤。这点东西,你真的未必懂! KVC执...
- 首先声明 我的标题本身就是个伪命题!!! KVC 与 KVO 的关系 就好比雷锋和雷峰塔的关系 标题就是为了吸引小...
- 首先声明 我的标题本身就是个伪命题!!! KVC 与 KVO 的关系 就好比雷锋和雷峰塔的关系 标题就是为了吸引小...
- 前言 在进行KVO讲解之前,我们先来了解一下类与对象,因为KVO的底层实现是基于runtime的,而其中用到了类与...
- GNUstep KVC/KVO探索(一):KVC的内部实现GNUstep KVC/KVO探索(二):KVO的内部实...