swift4 kvc

问题

swift4中使用kvc:

class Person: NSObject {
    var dog: Dog?
}
class Dog: NSObject {
    var name: String
    init(name: String) {
        self.name = name
    }
}

let whiteDog = Dog(name: "white")
let person = Person()
person.setValue(whiteDog, forKey: "dog")
let myDog: Dog = person.value(forKeyPath: "dog") as! Dog
print(myDog.name)
复制代码

然后会发生crash得到如下信息:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<RXLearn.Person 0x1c4002610> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key dog.'
复制代码

原因

swift为了性能优化,需要标记为@objc的属性才能使用kvc,所以这样:

class Person: NSObject {
    @objc var dog: Dog?
}
复制代码

swift4 新功能

无论结构体还是类都可以使用这个方法[keyPath: ReferenceWritableKeyPath<Root, Value>]进行取赋值。

class Person {
    var dog: Dog
    init(dog: Dog) {
        self.dog = dog
    }
}
class Dog {
    var name: String
    init(name: String) {
        self.name = name
    }
}
//
let blackDog = Dog(name: "black")
let whiteDog = Dog(name: "white")
let person = Person(dog: blackDog)
person[keyPath: \Person.dog] = whiteDog
        
let mydog = person[keyPath: name]
print(mydog.name) // 打印white
复制代码

person改为结构体依然可以:

struct Person {
    var dog: Dog
    init(dog: Dog) {
        self.dog = dog
    }
}
复制代码

转载于:https://juejin.im/post/5bd700fdf265da0afe632d43

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值