2010-12-04 32 views
5

Ben NSArray alt sınıfı için çalışıyorum, ancak sayım yöntemi erişmeye çalışırken o uygulamayı çöküyor. NSArray'un sınıf kümesinin olduğunu biliyorum. Amaç C - Subclassing NSArray

  • Ama bu ne anlama geliyor?
  • bir çalışma bir NSArray alt sınıf yapabilmesi için çevresinde var mı?

Ben sadece NSObject alt sınıf ve bir örnek değişkeni olarak benim dizi var ama yerine NSArray alt sınıf olacağını biliyorum.

DÜZENLEME: Sebep: Bir kart oyunu oluşturma , ekstra yöntemlere (-shuffle, -removeObjects:, -renew, vs) bir çift var NSMutableArray alt sınıf gereken bir sınıf Deck var ve Değişmesini düşünüyorum Bir varlığa sahip olmak yerine NSArray alt sınıfına daha temiz görünün.

+0

Neden alt sınıflara ihtiyacınız var? – MCannon

+3

Alt sınıflar yerine ekstra yöntemleri eklemek için bir kategori oluşturabilirim :( – aryaxt

+2

+1 Alt Sınıflandırma NS * Dizisi, Objective-C kategorilerinin tamamen gereksiz hale getirdiği ciddi bir overkill'tir .. –

cevap

16

böyle bir sınıf üzerinde bir kategori ekleyerek sorunu sınıfın tüm örnekleri ek yöntemler miras olacaktır. (Değil Her dizi edebilmesi gerekir, karıştırılacak olan, vb beri) ve o anda Bahsettiğiniz NSArray emin olmak için typechecking yarar çünkü (tehlikeli gerçekten karıştırılmaz bekleniyordu biri olduğu hem gereksiz).

alternatif bir örnek değişkeni olarak bir NSMutableArray sahip kendi Güverte sınıfı oluşturmak olacaktır. Burada, güvertenizdeki eylemleri istediğiniz gibi tanımlayabilirsiniz ve bir NSMutableArray kullandığınız gerçeği uygulama detayı haline gelir. Bu, derleme zamanında yazım denetiminden yararlanmanızı sağlar ve istemcilerini değiştirmeden Deck sınıfınızın iç uygulamasını değiştirmenize izin verir. Örneğin, bir NSMutableDictionary ürününün daha iyi bir destek deposu olacağına karar verdiyseniz, tüm bu değişiklikleri Deck sınıfını oluşturan ve kullanan herhangi bir kodu değiştirmeden Deck sınıfınızın uygulanması dahilinde yapabilirsiniz.

+2

@ Ryan - Bir kategori eklemek için herhangi bir örnek genel gider yoktur ... – nielsbot

+1

Teknik bir yük olduğunu ima etmiyor sanırım Sadece diyor ki her örnek sizin "alt sınıfınızın" işlevselliğini kazanır. eter ilgili veya değil. Örneğin, yanlışlıkla istemeden nesnelere ait bir NSArray üzerinde "-shuffle" ifadesi çağrılabilir veya çalışmayabilir ve buna izin verilmemelidir. –

6

Genellikle alt sınıf gerekmez, ancak her halükarda Apple tarafından yapılan öneri:

NSArray Herhangi alt sınıf ilkel örnek yöntemleri count ve objectAtIndex: kılmalıdır. Bu yöntemler, koleksiyonun öğeleri için sağladığınız destek deposunda çalışmalıdır. Bu destek deposu için bir statik dizi, standart bir NSArray nesnesi veya başka bir veri türü veya mekanizması kullanabilirsiniz. Alternatif bir uygulama sağlamak istediğiniz diğer NSArray yöntemlerini kısmen veya tamamen geçersiz kılmayı da seçebilirsiniz.

count yöntemini gerçekten geçersiz kıldınız mı? Diyelim ki, dizi elemanlarını tutmak için kendi destek yapınızı sağlamanız ve bu yöntemi göz önünde bulundurarak önerilen yöntemleri geçersiz kılmanız gerektiği söyleniyor ..

+0

mm sayımı geçersiz kıldım ve çağırarak [Süper sayım] ama bu işe yaramadı – aryaxt

+1

, NSArray tarafından sağlanan birime güvenmemeniz halinde kendi destek dizinizi sağlamanız gerekir, aksi takdirde bir örnek değişken olarak bir NSArray kullanabilir ve orijinal "saymayı" iç tarafa eşleyebilirsiniz. NSArray sayımı – Jack

3

Sadece yeni yöntemler ekliyorsanız ve mevcut destek mağazasını kullanıyorsanız, daha iyi bir yaklaşım NSArray'a bir kategori ekleyin. Kategoriler objektif C'nin gerçekten güçlü bir parçasıdır - bazı örnekler için bkz. cocoadev.

+2

Uygulamaya özel işlevsellik eklemek için NSArray'a kategori eklemek genellikle kötü bir fikirdir .. – bbum

-1

Bu özel durumda, - sortedArrayUsingComparator: kullanarak diziyi karıştırıp, karşılaştırıcınızın rastgele NSOrderedAscending veya NSOrderedDescending olmasını sağlarım.

ör:

NSArray *originalArray; // wherever you might get this. 
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator: 
    ^(id obj1, id obj2) { 
    return random() % 2 ? NSOrderedAscending : NSOrderedDescending; 
    }]; 
+0

Kesinlikle kararlı bir duruma yerleşmeyeceği için işe yaramayacağından emin olun. – bbum

+0

Aslında, işe yarıyor. @ "A" .. @ "J" içeren bir dizinin karıştırılması, karşılaştırma bloğunu 19 kez çağırır. – NSResponder

+0

Yanlış. Sıralama algoritmalarının toplam bir sıraya ihtiyacı vardır, yani tam olarak bir> b, a

0

NSMutableArray zaten bir değişken dizi özelliğine sahip bir NSObject alt sınıfı yapma en iyi olacağız bir - (void)removeObjectsInArray:(NSArray *)otherArray; sahiptir.