2010-01-16 26 views
8

Tamam, bu konuyla ilgili neden bu kadar kafamın karıştığını hızlı bir şekilde belirtebileceğinizi hissediyorum, ancak aşağıdakilerin neden bir derleyiciye OLMASI ile ilgili bir sorum var hata veya uyarı:Objective-C Tür Çıkarımı

NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ]; 

selectedObject bir NSObject ve name tip int bir @property ismi olur. Beni şaşkınlığa düşüren nedir

derleyici [ self.selectedObject valueForKey:name ] dönüşü sonucu integerValue çağrısı ile zincirine sırayla mesajı (bunu typecasting olmadan) tip NSNumber * ait olduğunu varsaymak mükemmel istekli olmasının nedeni budur.

Açıkçası, KVC NSNumber içine olmayan nesne "sayı" türlerini tamamladı fakat derleyici -valueForKey: bu özel durumda bir NSNumber * döneceğini bilmek için hiçbir yolu yoktur.

Neden "id '-integerValue' 'yanıtı boyunca bir derleyici uyarısı ile sonuçlanmıyor?"?

cevap

10

Umarım doğru anladım: Bunun nedeni id'un “özel” olmasıdır. id tipindeki nesneler istediğiniz herhangi bir mesajla gönderilebilir, derleyici tarafından kontrol yapılmaz ve her şey çalışma zamanında kontrol edilir. Veya diğer bir deyişle, id türü, Objective-C'nin “dinamik yazım” kısmıdır, diğer tüm tipler (NSObject gibi) “statik yazım” kısmıdır.

Bu şekilde, statik yazmayı kullanmak istediğiniz yeri ve dinamik yazmayı kullanmak istediğiniz yeri seçebilirsiniz. Böyle bir şey yapmak tamamen yasal:

id str1 = @"Hello"; 
id str2 = [str1 stringByAppendingString:@", world"]; 

Ama derleme zamanı statik tip onay kolaylık olsun çünkü genellikle, NSString s olarak “sıkı” dizeleri yazın ve yalnızca dinamik yazarak nereye başvurmak Statik olan, valueForKey durumundaki gibi olsun.

+0

Teşekkürler! Objective-C'de ayrıcalıklı bir tür olan 'id' ile ilgili bir his vardı. :) Eğilimim her zaman DAİMA sık sık şeyler yazın, bu yüzden bu garip davranışla hiç karşılaşmadım. Sanırım bu 'id' hem güçlü hem de tehlikeli. Derleyiciye "id" ile ilgili bazı bağlamlar sunmak için daha iyi bir yöntem olup olmadığını ya da "id" nin ne olacağı konusunda olumluysanız (örneğin benim örneğimde olduğu gibi) bunu bırakmak güzel bir şey olup olmadığını merak ediyorum . – LucasTizma

+0

Başlığın kuralı şöyledir: “Gerektiğinde Nerede Mümkün, Dinamik Yazma Statik Yazma.” (Daha fazla bilgi almak için Google'a sahip olabilirsiniz.) Bu durumda, ben tahmin yapmazdım, sadece ifadeyi okumak zorlaşır. Bazen derleyicinin doğru yöntemi seçmesine yardımcı olması için yazım yapmanız gerekir - bkz. Http://stackoverflow.com/questions/1113270. – zoul

+0

Bağlantı için teşekkürler. Mevcut SDK yöntem adlarıyla "çakışmaya" yol açan bir yöntem adlandırma sonucunda bazı küçük hatalarla karşılaştım. Derleyicinin bana deli olduğunu düşündüm. :) Ve evet, ben tamamen "Gerektiğinde Statik Yazma, Gerektiğinde Dinamik Yazma" felsefesinin bir yandaşıyım. Şimdi sadece Objective-C yazılan koleksiyonlar için destek eklerse ... Görünüşe göre daha sık görülmektense, koleksiyonlarımın ne saklayacağını biliyorum. – LucasTizma

İlgili konular