我正在尝试将以下 Objective-C 代码转换为 Swift。在我的 Objective-C 代码中,有一个静态变量,可以通过类方法访问它。
@implementation SomeClass
static NSMutableArray *_items;
+ (void)someMethod {
[_items removeAll];
}
@end
因为您无法访问这样声明的类型private var items = [AnyObject]()
从 Swift 中的类函数,我为它创建了一个存储属性,如下所示。
class var items: [AnyObject] {
return [AnyObject]()
}
我试图从类函数中调用它的方法,如下所示。
class func someFunction() {
items.removeAll(keepCapacity: false)
}
但我收到这个错误“[AnyObject]”类型的不可变值仅具有名为“removeAll”的可变成员.
谁能告诉我这个错误的原因是什么以及如何纠正它?
谢谢。
有了这个代码:
class var items: [AnyObject] {
return [AnyObject]()
}
您没有创建一个存储属性 - 相反,它是一个计算属性,最糟糕的是,每次访问它时,都会创建一个新实例[AnyObject]
已创建,因此无论您向其中添加什么,一旦其引用超出范围,它就会丢失。
至于错误,静态计算属性返回您在其主体中创建的数组的不可变副本,因此您不能使用任何声明为的数组方法mutating
- and 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")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)