2014-10-25 14 views
41

Aşağıdaki Objective-C kodunu Swift'e dönüştürmeye çalışıyorum. Objective-C kodumda, bir statik değişken var ve bir sınıf yönteminden erişiliyor. Swift'deki statik özellikler

@implementation SomeClass 

static NSMutableArray *_items; 

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

@end 

Eğer Swift sınıf işlevlerden bu private var items = [AnyObject]() gibi beyan türlerini erişemez yana

, böyle bunun için bir saklı özellik yarattı.

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

Ve bunun gibi bir sınıf işlevinden bir yöntemi çağırmaya çalışıyorum.

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

Ama bu hatayı '[AnyObject]' sadece üyeler seçildi mutasyona olan Çeşidi Immutable değeri elde 'removeAll'.

Bu hata nedenini ve nasıl düzeltileceğini bana söyleyen var mı?

Teşekkür ederiz. Bu kod ile

+0

Sorununuzu çözmeye çalışırken, "var öğeler: Array = [];' " –

cevap

72

:

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

bir saklı mülk oluşturarak değildir - bunun yerine bir bilgisayarlı bir özelliği olan ve kötü bölüm buna erişmek her zaman, [AnyObject] yeni bir örneği oluşturulur yani, Bu yüzden ona eklediğiniz her şey, referans kapsam dışına çıktığında kaybolur.

Hatayla ilgili olarak, statik hesaplanmış özellik, gövdesinde oluşturduğunuz dizinin değişmez bir kopyasını döndürür; böylece mutating olarak bildirilen dizi yöntemlerinden hiçbirini kullanamazsınız ve removeAll bunlardan biridir. Değişmez olmasının nedeni, bir alıcı tanımlamış olmanızdır, ama bir belirleyici değildir.

Şu Swift sınıflar statik özelliklerini desteklemez, ama yapılar yapmak - Ben sık kullandığınız geçici çözüm bir iç yapı tanımlamaktır:

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

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

Eğer Static yapı her zaman size kurtulmak istiyorsanız böylece

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

özelliği olarak daha basit ulaşılabilmesini:

bir sargı hesaplanan özellik tanımlamak, items özelliği bakınız Swift1.2 [Xcode6.3], statik anahtar kelimeyi kullanarak statik özellikleri ilan edebilir yılında
SomeClass.items.append("test") 
+3

yanıtı ile derleme hatasınınizi düzelttim. Yanıt için teşekkürler. Her yerde yapı adını eklemekten hoşlanmadım. Bu nedenle, statik özellik ile aynı ada sahip bir hesaplanmış özellik tanımladım ve buna erişebildim. Fikri [buradan] aldınız (http://stackoverflow.com/a/24924535/1077789). Bu iyi mi? – Isuru

+0

Evet, bu durumu eklemek için tamamlanmış bir yanıttır. – Antonio

23

210 ayrıca anahtar kelime sınıfını veya statik kullanılarak statik yöntemlerini ilan edebilir, Swift1.2


güncellendi.

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

DÜZENLEME:

static ve class modifiye arasındaki fark static ile değiştirilmiş yöntemler alt sınıflar geçersiz alınamaz böylece static, "son sınıf" için bir takma olmasıdır.Swift 2 için Maiaux en

+4

"Sınıf func" ve "statik func" arasındaki farkın, bir alt sınıfta geçersiz kılınabileceğinden bahsetmeye değer olabilir, bu yüzden tam olarak aynı değiller. Hızlı Programlama Dilinden: "Sınıflar, alt sınıfların bu sınıfın uygulanmasını geçersiz kılmasına izin vermek için sınıf anahtar sözcüğünü de kullanabilir". – Maiaux

+1

Eve döndüğümde bunu test edeceğim ama sormak güzel bir soru: Swift 1.2 desteği ** sınıf ** özellikleri? –

+2

@MAGNAWS Swift 1.2, ** sınıfı ** hesaplanmış özellikleri destekliyor.Ancak şu anda ** sınıf ** depolanan özellikleri desteklemiyor. – tounaobun

1

Yine kılavuzda @

Teşekkür hala ond yapılar statik mağaza properties'e kullanabilir numaralandırma iddia.