微信二维码

二维码 扫二维码马上关注
扫码咨询
向Swift扩展添加存储属性的最简单方法

class ExampleClass {}
 

 
fileprivate var storedProperty_FILEPRIVATE: [ObjectIdentifier:Int] = [:]
 
fileprivate var storedProperty_DEFAULT: Int = 0
 
extension ExampleClass {
 
    var storedProperty: Int {
 
        get {return storedProperty_FILEPRIVATE[ObjectIdentifier(self)] ?? storedProperty_DEFAULT}
 
        set {storedProperty_FILEPRIVATE[ObjectIdentifier(self)] = newValue}
 
    }
 
}
 

 
let a = ExampleClass()
 
let b = ExampleClass()
 
print(a.storedProperty) //0
 
b.storedProperty = 2
 
a.storedProperty = 1
 
print(a.storedProperty) //1
 
print(b.storedProperty) //2

就是这样。现在,您可以将变量定义保持在使用它的位置附近(在扩展中,而不是在类定义中)。

只需添加两个fileprivate变量或常量,并使用计算过的变量在扩展中访问它。

fileprivate访问控制确保变量storedProperty_FILEPRIVATE和storedProperty_DEFAULT不是全局的。

当然,您可以根据您的需求对其进行修改(例如,将其设置为只读,在设置之前进行验证,等等)。

不幸的是,我还没有找到一种方法来确保在对象实例化时初始化属性,因此我们必须提供一个默认值(在??空合并操作符),以防我们没有初始化对象的storedProperty。

如果不希望提供默认值,可以如下所示(注意,返回类型变为Int?而不是Int)

extension ExampleClass {
 
    var storedProperty: Int? {
 
        get {return storedProperty_FILEPRIVATE[ObjectIdentifier(self)]}
 
        set {storedProperty_FILEPRIVATE[ObjectIdentifier(self)] = newValue}
 
    }
 
}

更多精彩内容,请关注元吉优惠券网:专注阿里云代金券阿里云服务器报价腾讯云代金券的免费更新领取!
更多精彩内容推荐:

阿里云第四代云服务器全新上市
阿里云云虚拟主机控制台设置默认首页的方法
虚拟主机HTTPS加密访问的设置方法
阿里云常见问题合集一
如何对MySQL数据库进行优化
有关领取阿里云代金券的方法


在线客服
热线电话

扫一扫 微信加好友