我们可以在 Swift 中通过扩展添加静态存储变量吗?

Tho*_*hor 6 ios swift

在《Swift 编程语言 3.0》一书中,它说我们不能使用扩展来添加存储属性。

我使用实例存储变量进行了尝试,Xcode 按预期显示了错误。

但是当我尝试使用静态存储变量时,一切都编译得很好。

我是否遗漏或做错了什么?

class MyClass {}
extension MyClass {
    static var one: Int {
        return 1
    }
    static var two = 2 //compiled just fine 
}
let myVariable = MyClass()
MyClass.two
Run Code Online (Sandbox Code Playgroud)

Jac*_*ing 1

您不能将存储的属性放入扩展的实例中,但您可以稍微作弊并通过 Objective-C 关联对象获得相同的效果。尝试一下以下代码:

private var associationKey: UInt8 = 0
var validationTypes: ValidationTypes {
        get {
            return objc_getAssociatedObject(self, &associationKey) as? ValidationTypes ?? []
        }
        set(newValue) {
            objc_setAssociatedObject(self, &associationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
        }
    }
Run Code Online (Sandbox Code Playgroud)

显然ValidationTypes要适当更换。