2008-11-20 9 views
14

Bu kod ile sorun yaşıyorum:Kimliği bir float'a nasıl atarım?

NSRect itemFrame; 
id item; 
// code to assign item goes here. 
itemFrame.origin.y -= [item respondsToSelector:@selector(selectedHeight)] ? [item selectedHeight] : [self defaultSelectedHeight]; 

Bu sorunlu biraz:

[item selectedHeight] 

derleyici dönüş türü kimliği olduğunu varsayarak edilir.

(float)[item selectedHeight] 

ama çalışmıyor: Bunun bir atışı ekliyor Bunu düzeltmek istiyorum gerçi.

Neyi yanlış yapıyorum? (Sorunun id ile ilgili göstergelerin çözülmesiyle ilgili olduğundan şüpheliyim, ancak ilgili belgeleri bulamıyorum).

cevap

34

.

1

selectedHeight yönteminizin bildirimine bakmanız gerekir. Sorun, yöntemin bir nesneye (id) işaretçiyi döndürmesidir veya kod parçacığını içeren dosyada item için başlık dosyasını almadıysanız, Xcode varsayılan olarak bir işaretçi olduğunu varsayar.

Temelde uyumsuz türler olduklarından, bir işaretçiyi bir şamandıraya atamazsınız. Bildirimlerinizi aldıktan sonra, düzelmeniz gerekse de düzeltin. SelectedHeight öğesinin bir NSNumber döndürdüğünü varsayarak [[item selectedHeight] floatValue] öğesini istiyorsanız

1

Derleyici, birden fazla sınıfın aynı ada sahip yöntemleri bildirdiği ve farklı türler döndürdüğü varsayımları yapar. "Öğe" değişkeniniz bir "id" olarak yazıldığından, derleyici bu sınıflardan hangilerinin iletiyi göndereceği zamanda göndereceğini bilmez ve birini seçer.

, bunun yerine genel "id" belirli bir türüyle bildirerek, bir örneği olup hangi sınıf "öğesi" derleyici bilgilendirebilir Bu sorunu önlemek için:

SomeItemClass *item; 

Ayrıca önlemek olabilir Farklı türler döndüren aynı adlı yöntemleri bildirerek değil.

5

Aşağıdaki kodun iOS 6 SDK için çalıştığını biliyorum. obj nesnesinin bir float değeri içerdiğini varsayalım.

id obj; 
float fVal; 

fVal = [obj floatValue];