我正在尝试将以下Objective-C代码转换为Swift。在我的Objective-C代码中,有一个静态变量,可以从类方法中对其进行访问。
@implementation SomeClass static NSMutableArray *_items; + (void)someMethod { [_items removeAll]; } @end
由于您无法private var items = [AnyObject]()从Swift的类函数中访问像这样声明的类型,因此我为此创建了一个存储属性。
private var items = [AnyObject]()
class var items: [AnyObject] { return [AnyObject]() }
我试图从这样的类函数中对其调用方法。
class func someFunction() { items.removeAll(keepCapacity: false) }
但是我得到这个错误 类型’[AnyObject]’的不可变值仅具有名为’removeAll’的变异成员 。
谁能告诉我此错误的原因以及如何纠正该错误?
谢谢。
使用此代码:
您不是在创建存储的属性- 而是计算的属性,最糟糕的部分是每次访问该属性时,都会[AnyObject]创建一个新实例,因此无论添加到它的什么地方,一旦其引用消失,它就会丢失范围。
[AnyObject]
对于错误,静态计算属性将返回您在其主体中创建的数组的不变副本,因此您不能使用任何声明为mutating- 的数组方法,并且removeAll是其中之一。它不可变的原因是因为您定义了一个吸气剂,而不是一个setter。
mutating
removeAll
当前,Swift类不支持静态属性,但是结构支持-我经常使用的解决方法是定义内部结构:
class SomeClass { struct Static { static var items = [AnyObject]() } } SomeClass.Static.items.append("test")
如果要在Static每次引用该items属性时都摆脱该结构,只需定义一个包装的计算属性:
Static
items
class var items: [AnyObject] { get { return Static.items } set { Static.items = newValue } }
这样就可以更简单地访问该属性:
SomeClass.items.append("test")