Swift4.0--用@objcMembers填平的辣些坑

KVC

在Swift4.0版本中,使用KVC的setValuesForKeys()方法进行赋值时,每次都会崩在setValuesForKeys这个方法中:

Snip20180510_6.png

查了一下,果然万能的小伙伴们已经找到原因啦~~kkk
在swift3中,编译器自动推断@objc,换句话说,它自动添加@objc
在swift4中,编译器不再自动推断,你必须显式添加@objc
还有一种更简单的方法,不需要一个一个属性的添加,方法如下:

//在类的前面加上@objcMembers
@objcMembers class Person: NSObject {

}

运行时

Snip20180510_8.png

类的属性前面需要加上@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..

参考:https://www.jianshu.com/p/f165ab3a12b0

你可能感兴趣的:(Swift4.0--用@objcMembers填平的辣些坑)