gpt4 book ai didi

ios - Swift 中的静态属性

转载 作者:IT王子 更新时间:2023-10-29 05:00:41 24 4
gpt4 key购买 nike

我正在尝试将以下 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")

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

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

这样可以更简单地访问该属性:

SomeClass.items.append("test")

关于ios - Swift 中的静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26567480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com