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) } }
编辑:
static
和class
修饰符之间的区别在于static
只是“类最终”的别名,所以用static
修改的方法不能在子类中重写。
谢谢@ Maiaux的
然而Swift 2的手册仍然声称枚举ond结构可能会使用静态存储特性。