swift4|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: '[ 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]
进行取赋值。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] = whiteDoglet mydog = person[keyPath: name]
print(mydog.name) // 打印white
复制代码
将
person
改为结构体依然可以:struct Person {
var dog: Dog
init(dog: Dog) {
self.dog = dog
}
}
复制代码
【swift4|swift4 kvc】转载于:https://juejin.im/post/5bd700fdf265da0afe632d43
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- jhipster|jhipster 升级无效问题
- “精神病患者”的角度问题
- 解决SpringBoot引用别的模块无法注入的问题
- Hive常见问题汇总
- 姚老师互动问答会|姚老师互动问答会 # 问题001(如何更有智慧的和身边人分享金刚智慧())
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- 【教育故事】|【教育故事】 一个“问题学生”的蜕变
- 蓝桥杯试题
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片