当前位置: 首页 > 面试题库 >

Swift中的静态属性

拓拔俊艾
2023-03-14
问题内容

我正在尝试将以下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-
的数组方法,并且removeAll是其中之一。它不可变的原因是因为您定义了一个吸气剂,而不是一个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")


 类似资料:
  • 模型静态属性 [ ] model 定义一个模型 'use strict'; module.exports = app => { const { STRING, INTEGER, DATE } = app.Sequelize; const Post = app.model.define('post', { id: { type: INTEGER, prima

  • 我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "prototype"。这样的方法被称为 静态的(static)。 在一个类中,它们以 static 关键字开头,如下所示: class User { static staticMethod() { alert(this === User); } } User.staticMethod(); // true 这实际上跟直接将其

  • 问题内容: 我试图弄清楚如何声明一个静态变量,其范围仅限于Swift中的函数。 在C中,这可能看起来像这样: 在Objective-C中,基本上是相同的: 但是我似乎无法在Swift中做这样的事情。我尝试通过以下方式声明变量: 但是这些都会导致错误。 第一个抱怨“静态属性只能在类型上声明”。 第二个抱怨“期望的声明”(在哪里)和“期望的模式”(在哪里) 第三条抱怨“一行上的连续语句必须用’;’分隔

  • 问题内容: 因此,我正在使用Swift开发一个iOS项目,我想创建一个包含一些有用内容的静态库。 我的问题是,当我尝试在Xcode(6.3版)中构建我的库时,出现了“ Build Failed”,随后是: 我从未见过,这不是我的第一个静态库。所以我想我可能与我只使用Swift类的事实有关。 你们有什么感想 ?先感谢您。 问题答案: 从Xcode 9 beta 4开始,Xcode原生支持带有Swif

  • 我找不到和之间的任何区别。据我所知,类静态函数不能被继承,struct也没有继承的选项。 请不要被类中的静态函数和类函数所混淆。 VS

  • 问题内容: 如果我尝试序列化静态属性会怎样? 谢谢 问题答案: 从这篇文章: 提示1:处理静态变量 Java类通常在静态类变量中包含一些全局相关的值。我们不会进入有关全局变量是否适当的争论的悠久历史- 只能说程序员继续发现它们有用,而纯粹主义者建议的替代方案并不总是可行的。 对于声明时初始化的静态变量,序列化不会出现任何特殊问题。第一次使用该类时,相关变量将设置为正确的值。 某些静态无法通过这种方