谨以此记录Swfit4.0的学习过程
类的属性前面需要加上@objc关键词或者类前面加上@objcMembers ,否则运行时访问不了类的属性
原因:在Swift 4中继承 NSObject 的 swift class 不再默认全部 bridge 到 OC,如果我们想要使用的话我们就需要在class前面加上@objcMembers 这么一个关键字。
引用: 在 swift 3 中除了手动添加 @objc 声明函数支持 OC 调用还有另外一种方式:继承 NSObject。class 继承了 NSObject 后,编译器就会默认给这个类中的所有函数都标记为 @objc ,支持 OC 调用。苹果在Swift 4 中苹果修改了自动添加 @objc 的逻辑:一个继承 NSObject 的 swift 类不再默认给所有函数添加 @objc。只在实现 OC 接口和重写 OC 方法时才自动给函数添加 @objc 标识。
import UIKit
//需要加上@objcMembers 这么一个关键字。
@objcMembers class Student: NSObject {
var name :String?
var age : Int = 18
var title = "I like League of legend"
var a:String?
///[使用运行时]获取当前类所有的属性数组
class func propertyList() -> [String] {
var count :UInt32 = 0
//获取‘类’的属性列表
let list = class_copyPropertyList(self, &count)
print("属性的数量\(count)")
for i in 0..<Int(count) {
//根据下标 获取属性
let a = list?[i]
//获取属性的名称
let cName = property_getName(a!)
let n = String(utf8String:cName)
print(cName)
print(n as Any)
print("hhh")
}
return [];
}
}