SORU
16 Mart 2009, PAZARTESİ


, NSMutableArray, vb NSArray üzerine yazmaya zorlamak için herhangi bir yolu var mı?

Tüm öğeleri yazın SomeClass olan bir NSMutableArray yapabilir miyim?

CEVAP
16 Mart 2009, PAZARTESİ


Bu oldukça yaygın bir soru için insanlar geçiş kuvvetle türü diller (C ya da Java) daha zayıf ya da dinamik olarak yazılan diller gibi Python, Ruby, ya da Objective-C Objective-C, En nesneleri devralır NSObject (tip id) (geri kalan miras, bir diğer kök sınıf gibi NSProxy ve de olabilir türü id), ve herhangi bir mesaj gönderilebilir herhangi bir nesne. Tabii ki, tanımadığı bir örnek, bir ileti gönderme zamanı hatası neden olabilir (ve ayrıca bir derleyici neden oluruyarı-W uygun bayraklar) ile. Bir örnek, gönderdiğiniz mesaja sürece, ait olduğu ne olduğu önemli değil. Bu sık sık olarak anılacaktır "ördek yazarak" çünkü "eğer bir ördek vaklaması gibi [yani yanıt için bir seçici, bir ördek [yani bu çalışabilir mesaj; kimin umurunda ne sınıf]".

Örneği -(BOOL)respondsToSelector:(SEL)selector yöntemi ile zamanında seçici yanıt verip vermediğini test edebilirsiniz. Varsayarak için aramak istediğiniz yöntemi her olayda bir dizi ama değil mi emin olan tüm örnekleri üstesinden gelebilir mesajı (yani öylece kullanın NSArray's -[NSArray makeObjectsPerformSelector:] gibi bir şey olur bu iş:

for(id o in myArray) {
  if([o respondsToSelector:@selector(myMethod)]) {
    [o myMethod];
  }
}

Eğer kontrol için kaynak kod örnekleri uygulamak hangi yöntem(ler) istediğiniz için çağrı, daha ortak bir yaklaşım olacağını tanımlamak için @protocol içeren bu yöntemleri ve beyan sınıf soru uygulayan protokolünde yer aldı. Bu kullanım, @protocol bir Java Arayüzü veya C soyut bir temel sınıf ile aynıdır. O zaman her yöntem için yanıt yerine, bütün protokol ile uyumluluk için test edebilirsiniz. Önceki örnekte, çok bir fark yok, ama eğer birden fazla yöntem arıyor olsaydın, işleri basitleştirmek olabilir. Daha sonra örnek olabilir:

for(id o in myArray) {
  if([o conformsToProtocol:@protocol(MyProtocol)]) {
    [o myMethod];
  }
}

MyProtocol varsayarsak beyan eder myMethod. Bu ikinci yaklaşım kod daha niyetini açıklar nedeniyle tercih edilmektedir.

Genellikle, bu yaklaşımlardan biri, bir dizi tüm nesnelerin belirli bir tür olup olmadığını ilgilenmek sizi kurtarır. Eğer hala bakım eğer standart dinamik dil yaklaşımı birim test, birim test, birim test. Çünkü bir gerileme içinde bu gereksinimi oluşturacak bir (muhtemelen kurtarılamaz) çalışma zamanı (derleme zamanı) hata, sana ihtiyacımız var test kapsama doğrulamak için davranış böylece bırakma davetsiz yaban ellere. Bu örnekte, dizi değiştiren bir işlem peform, dizideki tüm örneklerini belirli bir sınıfa ait olduğunu doğrulayın. Uygun test kapsamı ile, hatta örnek kimlik doğrulama için ilave çalışma zamanı havai gerek yok. İyi birim test kapsama alanı var, değil mi?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Brandon McCrary

    Brandon McCr

    15 Ocak 2012
  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006
  • kidrauhl

    kidrauhl

    15 Ocak 2007