運行時加載屬性列表、Swift4中的 @objcMembers

    基本代碼     
 import UIKit
@objcMembers class Person: NSObject {
var name : String?
var age : Int = 0
//private var title : String?
//private 的屬性,使用運行時,同樣獲取不到屬性(可以獲取到ivar),使用KVC會崩潰
var title : String?
//使用運行時獲取當前類的所有屬性的數組
class func propertyList() -> [String]{
    var count : UInt32 = 0
    let list = class_copyPropertyList(self, &count)
    print(#function, "屬性的數量\(count)")
    for i in 0..<Int(count) {
        let pty = list?[i]
        let cName = property_getName(pty!)
        let name = String(utf8String: cName)
        print(#function, "\(name ?? "")")
    }

    //使用 guard
    for i in 0..<Int(count) {
        guard let pty: objc_property_t = list?[i],
            let cName: UnsafePointer<Int8> = property_getName(pty),
            let name:String = String(utf8String: cName)
            else{
                continue
        }
        print(#function, "\(name)")
    }
    free(list)
    return []
}
}

原因:
@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 標識。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容