swift. 扩展类添加属性_Swift 扩展「可以」添加存储属性

原标题:Swift 扩展「可以」添加存储属性

译者:;校对:;定稿:

好吧,其实我标题党了:Swift 扩展。然而如果你愿意用 ,你可以在 Swift 中做一些同样有趣的事。有很多的模板可供选择,然而如果你用这些,你也就牺牲了类型安全。我们可以做得更好吗?

当然可以。这里就是一些这样的函数,使用 Swift 类型推断的黑魔法,使你在类或协议扩展中写类型安全的非 Optional 计算属性时,就像存储属性一样。

import Foundation func associatedObject( base: AnyObject, key: UnsafePointer, initialiser: () -> ValueType) -> ValueType { if let associated = objc_getAssociatedObject(base, key) as? ValueType { return associated } let associated = initialiser() objc_setAssociatedObject(base, key, associated, .OBJC_ASSOCIATION_RETAIN) return associated } func associateObject( base: AnyObject, key: UnsafePointer, value: ValueType) { objc_setAssociatedObject(base, key, value, .OBJC_ASSOCIATION_RETAIN) }

函数就那么长。你可以这样使用它们:

class Miller {} // 这是我们要扩展的类 class Cat { // 每个磨坊主都有一只猫 var name = “Puss” } private var catKey: UInt8 = 0 // 我们还是需要这样的模板 extension Miller { var cat: Cat { // cat「实际上」是一个存储属性 get { return associatedObject(self, key: &catKey) { return Cat() } // 设置变量的初始值 } set { associateObject(self, key: &catKey, value: newValue) } } }

如果你在家可以跟着练习的话,你可以在 playground 中敲下下面几行代码,来确保它能正常工作。

let grumpy = Miller() grumpy.cat.name // 显示 Puss grumpy.cat.name = “Hephaestos” grumpy.cat.name // 显示 Hephaestos

就这么简单!

致谢:这个实现至少一半来自于 。他在扩展中使用了关联对象,我把这个模式提出来作为一个可重用的类,然后我们一起把这个类修改成了你看到的那两个方法。代码是我写的,如果其中有任何错误,都是我的锅。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 。

打赏全部发给译者

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值