swift中使用runtime修改属性值

swift中使用runtime修改属性值

Swift中的@objc和dynamic关键字

在OC中继承自NSObject的类都遵循runtime, 那么纯粹的Swift类呢?
如果在swift中想使用runtime修改属性值,在属性和方法之前加上@objc关键字, 则一般情况下可以在runtime中使用了. 但有一些情况下, Swift会做静态优化而无法使用runtime.要想完全使得属性和方法被动态调用, 必须使用dynamic关键字. 而dynamic关键字会隐式地加上@objc来修饰.

1、例如有如下一个控制器,它有一个私有属性titleString,要想通过runtime修改属性值,必须在属性前添加@objc关键字。如何在外面修改属性值呢?

class FirstViewController: UIViewController {
    @objc fileprivate var titleString: String = ""
    override func viewDidLoad() {
    super.viewDidLoad()
    self.title = titleString
    }
}

2、runtime修改上面控制器中私有属性titleString:

//方法一:
//parameters是你要修改某个属性的值如:["titleString": "GoodsDetailPage"]
func runtimeChangeValue(vc: UIViewController, parameters: [String: Any]) {
    var ivarCount: UInt32 = 0
   let ivarList = class_copyIvarList(vc.classForCoder, &ivarCount)
   for i in 0..<ivarCount {
       let ivar = ivarList![Int(i)]
       let key = String(cString: ivar_getName(ivar)!)
       if let param = parameters[key] as? String {
           vc.setValue(param, forKey: key)
        }
    }
}
//方法二:
func runtimeChangeValue(vc: UIViewController, parameters: [String: Any]) {
    var outCount: UInt32 = 0
   let properties = class_copyPropertyList(vc.classForCoder, &outCount)
   for i in 0..<outCount {
       let property = properties![Int(i)]
       let key = String(cString: property_getName(property))
       if let param = parameters[key] as? String {
           vc.setValue(param, forKey: key)
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,172评论 3 119
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 15,074评论 4 61
  • 是时候梳理一下自己的工作和生活中心和重心了。 既然我找到了接替我工作的人,第一,我要慢慢的把我替换下来,很简单,我...
    庄德坤阅读 209评论 0 0
  • 都说若如初见,说明人与人之间在最初认识时是多么美好的,也想那种美好延续下去,甚至有那种“不打不相识”的言语表示最初...
    匆匆不离去阅读 757评论 2 2
  • 昨宵黄色满东篱,悠然笑卧南山西。 莫言平日多威武,今我当季慢相欺。 世事循环君不急,冬雪春花长相忆。 守得寂寞三百...
    飞哥判案阅读 364评论 0 0

友情链接更多精彩内容