美文网首页swift
运行时加载属性列表、Swift4中的 @objcMembers

运行时加载属性列表、Swift4中的 @objcMembers

作者: ibiaoma | 来源:发表于2018-03-08 16:15 被阅读1331次
    基本代码     
 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 标识。

相关文章

  • 运行时加载属性列表、Swift4中的 @objcMembers

    原因:@objcMembers 在Swift 4中继承 NSObject 的 swift class 不再默认全部...

  • Swift4.0 用运行时访问类的属性

    类的属性前面需要加上@objc关键词或者类前面加上@objcMembers ,否则运行时访问不了类的属性 原因:在...

  • 2020-03-09

    分类: 运行时添加类方法列表、实例方法列表、实现协议列表,没有属性列表,使用@property添加的属性,编译期间...

  • 列表 表单

    列表 有序列表无序列表嵌套列表自定义列表 属性加载tape=属性值有序列表从几开始 可以有start=“10”、...

  • swift-30运行时加载属性列表

    我以前做的swift笔记, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以当做自己...

  • OC方法的懒加载

    前言 iOS中,大家都比较熟悉属性的懒加载,其实OC方法也能懒加载。在程序运行时,去加载指定方法,可以起到节约性能...

  • Swift获取属性列表和ivar列表

    swift 也可以通过运行时获取类的属性列表和 ivar 列表 新建一个model 类 并且添加属性 下面是获取 ...

  • Properties:

    Properties类表示了一个持久的属性集,Properties 可以保存在流中或从流中加载.属性列表中每个键及...

  • 运行时使用之获取属性、字典转模型

    需求驱动开发 模型中实现字典转模型 --> 获取模型的属性 (运行时方法) 1.获取属性列表2.取出objc_pr...

  • iOS底层原理——runtime

    runtime runtime 是iOS的运行时,用于实现iOS加载和调用属性和方法。 函数中load方法没有使用...

网友评论

    本文标题:运行时加载属性列表、Swift4中的 @objcMembers

    本文链接:https://www.haomeiwen.com/subject/iwyyfftx.html