Swift中的静态属性

我试图将下面的Objective-C代码转换为Swift。 在我的Objective-C代码中,有一个静态variables,它可以通过类方法访问。

@implementation SomeClass static NSMutableArray *_items; + (void)someMethod { [_items removeAll]; } @end 

既然你不能从Swift的类函数中访问类似private var items = [AnyObject]()的types,我为它创build了一个存储属性。

 class var items: [AnyObject] { return [AnyObject]() } 

我试图从类似的function调用它的方法。

 class func someFunction() { items.removeAll(keepCapacity: false) } 

但是我得到这个错误types'[AnyObject]'的不可变值只有名为'removeAll'的变异成员

任何人都可以告诉我这个错误的原因是什么,以及如何纠正?

谢谢。

有了这个代码:

 class var items: [AnyObject] { return [AnyObject]() } 

你不是创build一个存储的属性 – 而是一个计算的属性,最糟糕的部分是每次你访问它时,都会创build一个新的[AnyObject]实例,所以无论你添加什么,它都会一失参考超出范围。

至于错误,静态计算属性会返回您在其正文中创build的数组的不可变副本,因此您不能使用任何声明为mutating的数组方法 – 而removeAll就是其中之一。 它不可变的原因是因为你定义了一个getter,而不是setter。

目前Swift类不支持静态属性,但结构做 – 我经常使用的解决方法是定义一个内部结构:

 class SomeClass { struct Static { static var items = [AnyObject]() } } SomeClass.Static.items.append("test") 

如果你想在每次引用items属性时去掉Static结构,只需定义一个包装器计算属性:

 class var items: [AnyObject] { get { return Static.items } set { Static.items = newValue } } 

这样可以更简单地访问该属性,如下所示:

 SomeClass.items.append("test") 

更新到Swift1.2


在Swift1.2 [Xcode6.3]中,可以使用关键字static声明静态属性,也可以使用关键字class或static声明静态方法。

 class SomeClass { // use static modifier to declare static properties. static var items: [AnyObject]! // use class modifier to declare static methods. class func classMethod() { items.removeAll(keepCapacity: false) } // use static modifier to declare static methods. static func staticMethod() { items.removeAll(keepCapacity: false) } } 

编辑:

staticclass修饰符之间的区别在于static只是“类最终”的别名,所以用static修改的方法不能在子类中重写。

谢谢@ Maiaux的

然而Swift 2的手册仍然声称枚举ond结构可能会使用静态存储特性。