web-dev-qa-db-ja.com

Swiftの静的プロパティ

次の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」という名前の変更メンバーのみが含まれます

このエラーの原因と修正方法を教えてください。

ありがとうございました。

43
Isuru

このコードでは:

class var items: [AnyObject] {
    return [AnyObject]()
}

格納されたプロパティを作成していません-代わりに計算されたプロパティであり、最悪の部分はそれにアクセスするたびに[AnyObject]の新しいインスタンスが作成されるため、追加するものはすぐに失われますその参照が範囲外になるため。

エラーについては、静的な計算プロパティは、作成した配列の不変のコピーを本体に返すため、mutating-およびremoveAllが1として宣言された配列メソッドは使用できません。そのうちの。不変である理由は、セッターではなくゲッターを定義したためです。

現在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")
75
Antonio

Swift1.2に更新


Swift1.2 [Xcode6.3]では、キーワード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)
    }
}

編集:

static修飾子とclass修飾子の違いは、staticが単なる「クラス最終」のエイリアスであるため、staticで変更されたメソッドをオーバーライドできないことです。サブクラス。

ありがとう@Maiauxの

23
tounaobun

それでもSwift 2のマニュアルでは、列挙型構造だけが静的なストアプロパティを使用している可能性があると主張しています。

1
user1785898