2008-11-20 10 views
14

Mam problem z tym kodem:Jak przesłać identyfikator do elementu pływającego?

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

Jest to problematyczne bit:

[item selectedHeight] 

Kompilator jest przy założeniu, że typ zwracany jest identyfikator. Myślę, że dodanie odlewu rozwiązałoby to:

(float)[item selectedHeight] 

ale to nie działa.

Co robię źle? (Podejrzewam, że problem polega na rozwiązywaniu wskaźników związanych z identyfikatorem, ale nie mogę znaleźć odpowiedniej dokumentacji).

Odpowiedz

34

chcesz [[item selectedHeight] floatValue], zakładając, że selectedHeight zwraca NSNumber.

1

Musisz spojrzeć na deklarację swojej metody selectedHeight. Problem polega na tym, że metoda zwraca wskaźnik do obiektu (id) lub nie zaimportował pliku nagłówka dla item w pliku zawierającym fragment kodu, więc Xcode domyślnie przyjmuje wskaźnik.

Nie można rzutować wskaźnika na zmiennoprzecinkowe, ponieważ są to zasadniczo niezgodne typy. Kiedy już uporządkujesz swoje deklaracje, powinieneś być w porządku.

1

Kompilator tworzy tego rodzaju założenia, gdy wiele klas deklaruje metody o tej samej nazwie, które zwracają różne typy. Ponieważ twoja zmienna "przedmiot" jest wpisana jako "id", kompilator nie wie, która z tych klas będzie wysyłać wiadomość w czasie wykonywania i wybiera jedną.

Aby uniknąć tego problemu, można poinformować kompilator, co klasa „artykuł” jest instancją, deklarując ją z konkretnym rodzajem zamiast generycznego „id”:

SomeItemClass *item; 

Można również uniknąć nie deklarując metod o identycznej nazwie, które zwracają różne typy.

5

Wiem, że poniższy kod działa na iOS 6 SDK. Zakładam, że obiekt obj zawiera wartość zmiennoprzecinkową.

id obj; 
float fVal; 

fVal = [obj floatValue]; 
Powiązane problemy