webentwicklung-frage-antwort-db.com.de

Statische Eigenschaften in Swift

Ich versuche, den folgenden Objective-C-Code in Swift umzuwandeln. In meinem Objective-C-Code gibt es eine statische Variable, auf die über eine Klassenmethode zugegriffen wird.

@implementation SomeClass

static NSMutableArray *_items;

+ (void)someMethod {
    [_items removeAll];
}

@end

Da Sie in Swift nicht auf Typen zugreifen können, die als private var items = [AnyObject]() deklariert wurden, habe ich dafür eine gespeicherte Eigenschaft erstellt.

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

Und ich versuche, eine Methode von einer Klassenfunktion wie dieser aufzurufen.

class func someFunction() {
    items.removeAll(keepCapacity: false)
}

Aber ich bekomme diesen Fehler nveränderlicher Wert vom Typ '[AnyObject]' hat nur mutierende Mitglieder mit dem Namen 'removeAll'.

Kann mir bitte jemand sagen, woher dieser Fehler stammt und wie er behoben werden kann?

Vielen Dank.

43
Isuru

Mit diesem Code:

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

sie erstellen keine gespeicherte Eigenschaft, sondern eine berechnete Eigenschaft. Das Schlimmste ist, dass bei jedem Zugriff eine neue Instanz von [AnyObject] wird erstellt, was auch immer Sie hinzufügen, es geht verloren, sobald seine Referenz den Gültigkeitsbereich verlässt.

In Bezug auf den Fehler gibt die Eigenschaft static computed eine unveränderliche Kopie des Arrays zurück, das Sie in seinem Hauptteil erstellt haben. Daher können Sie keine der als mutating - und removeAll deklarierten Array-Methoden verwenden von ihnen. Der Grund, warum es unveränderlich ist, ist, dass Sie einen Getter definiert haben, aber keinen Setter.

Derzeit unterstützen Swift - Klassen keine statischen Eigenschaften, aber Strukturen - die häufig verwendete Problemumgehung besteht darin, eine innere Struktur zu definieren:

class SomeClass {
    struct Static {
        static var items = [AnyObject]()
    }
}

SomeClass.Static.items.append("test")

Wenn Sie die Static -Struktur bei jedem Verweis auf die items -Eigenschaft entfernen möchten, definieren Sie einfach eine berechnete Wrapper-Eigenschaft:

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

so dass die Eigenschaft einfacher zugegriffen werden kann als:

SomeClass.items.append("test")
75
Antonio

Auf Swift1.2 aktualisiert


In Swift1.2 [Xcode6.3] können Sie statische Eigenschaften mit dem Schlüsselwort static und statische Methoden mit der Schlüsselwortklasse oder static deklarieren.

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

BEARBEITEN:

Der Unterschied zwischen dem Modifikator static und class besteht darin, dass static nur ein Alias ​​für "class final" ist, sodass mit static geänderte Methoden nicht überschrieben werden können Unterklassen.

Vielen Dank an Maiaux

23
tounaobun

Das Handbuch für Swift 2 behauptet jedoch immer noch, dass nur Aufzählungen und Strukturen statische Speichereigenschaften verwenden können.

1
user1785898