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