KVC
在Swift4.0版本中,使用KVC的setValuesForKeys()方法进行赋值时,每次都会崩在setValuesForKeys这个方法中:
查了一下,果然万能的小伙伴们已经找到原因啦~~kkk
在swift3中,编译器自动推断@objc,换句话说,它自动添加@objc
在swift4中,编译器不再自动推断,你必须显式添加@objc
还有一种更简单的方法,不需要一个一个属性的添加,方法如下:
//在类的前面加上@objcMembers
@objcMembers class Person: NSObject {
}
运行时
类的属性前面需要加上@objc关键词或者在类前面加上@objcMembers关键词,否则运行时访问不了类的属性
原因:在Swift4中,继承NSObject的swift class不再默认全部bridge到OC,如果我们想要使用的话 我们就需要在class前面加上@objcMembers这个关键字。
注:在Swift3中,除了
手动添加 @objc 声明函数支持OC调用
还有另外一种方式:
继承 NSObject
class继承了NSObject后,编译器就会默认给这个类中的所有函数都标记为@objc,支持OC调用。
苹果在Swift4中,修改了自动添加@objc的逻辑:
一个继承NSObject的Swift类不在默认给所有函数添加@objc。只在实现OC接口和重写OC方法时,才自动给函数添加@objc标识。
import UIKit
@objcMembers class Person: NSObject {
var name: String?
var age: Int = 0
var title: String?
class func propertyList() -> [String] {
var count: UInt32 = 0
let list = class_copyPropertyList(self, &count)
print("属性的数量 \(count)")
for i in 0..<Int(count) {
let pty = list?[i]
let cName = property_getName(pty!)
let name = String(utf8String: cName)
print(name ?? "")
}
return []
}
}