KVC
在Swift4.0版本中,使用KVC的setValuesForKeys()方法進(jìn)行賦值時(shí)胳螟,每次都會(huì)崩在setValuesForKeys這個(gè)方法中:
Snip20180510_6.png
查了一下集晚,果然萬能的小伙伴們已經(jīng)找到原因啦~~kkk
在swift3中,編譯器自動(dòng)推斷@objc,換句話說巫糙,它自動(dòng)添加@objc
在swift4中,編譯器不再自動(dòng)推斷焰望,你必須顯式添加@objc
還有一種更簡單的方法骚亿,不需要一個(gè)一個(gè)屬性的添加,方法如下:
//在類的前面加上@objcMembers
@objcMembers class Person: NSObject {
}
運(yùn)行時(shí)
Snip20180510_8.png
類的屬性前面需要加上@objc關(guān)鍵詞或者在類前面加上@objcMembers關(guān)鍵詞熊赖,否則運(yùn)行時(shí)訪問不了類的屬性
原因:在Swift4中来屠,繼承NSObject的swift class不再默認(rèn)全部bridge到OC,如果我們想要使用的話 我們就需要在class前面加上@objcMembers這個(gè)關(guān)鍵字震鹉。
注:在Swift3中俱笛,除了
手動(dòng)添加 @objc 聲明函數(shù)支持OC調(diào)用
還有另外一種方式:
繼承 NSObject
class繼承了NSObject后,編譯器就會(huì)默認(rèn)給這個(gè)類中的所有函數(shù)都標(biāo)記為@objc传趾,支持OC調(diào)用迎膜。
蘋果在Swift4中,修改了自動(dòng)添加@objc的邏輯:
一個(gè)繼承NSObject的Swift類不在默認(rèn)給所有函數(shù)添加@objc浆兰。只在實(shí)現(xiàn)OC接口和重寫OC方法時(shí)磕仅,才自動(dòng)給函數(shù)添加@objc標(biāo)識(shí)。
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("屬性的數(shù)量 \(count)")
for i in 0..<Int(count) {
let pty = list?[i]
let cName = property_getName(pty!)
let name = String(utf8String: cName)
print(name ?? "")
}
return []
}
}