前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >swift中使用runtime修改属性值

swift中使用runtime修改属性值

作者头像
用户6094182
发布2019-08-23 18:00:06
2.4K0
发布2019-08-23 18:00:06
举报
文章被收录于专栏:joealzhoujoealzhou
swift中使用runtime修改属性值
Swift中的@objc和dynamic关键字

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

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

代码语言:javascript
复制
class FirstViewController: UIViewController {
    @objc fileprivate var titleString: String = ""
    override func viewDidLoad() {
    super.viewDidLoad()
    self.title = titleString
    }
}

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

代码语言:javascript
复制
//方法一:
//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)
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • swift中使用runtime修改属性值
    • Swift中的@objc和dynamic关键字
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档