Swift中的静态属性

时间:2014-10-25 21:33:57

标签: ios class swift static-methods static-members

我试图将以下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' 的变异成员。

任何人都可以告诉我这个错误的原因是什么以及如何纠正它?

谢谢。

3 个答案:

答案 0 :(得分:75)

使用此代码:

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")

答案 1 :(得分:23)

已更新至Swift1.2


在Swift1.2 [Xcode6.3]中,您可以使用关键字static声明静态属性,也可以使用关键字class或static声明静态方法。

class SomeClass {

    // use static modifier to declare static properties.
    static var items: [AnyObject]!

    // use class modifier to declare static methods.
    class func classMethod() {

        items.removeAll(keepCapacity: false)
    }

    // use static modifier to declare static methods.
    static func staticMethod() {

        items.removeAll(keepCapacity: false)
    }
}

编辑:

staticclass修饰符之间的区别在于static只是“类final”的别名,因此使用static修改的方法无法在子类中重写

谢谢@Maiaux的

答案 2 :(得分:1)

然而,Swift 2的手册仍声称枚举结构可能会使用静态存储特性。