2008-11-20 1 views
14

У меня возникли проблемы с этим кодом:Как мне сделать id для поплавка?

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

Это проблематично немного:

[item selectedHeight] 

Компилятор предполагает, что тип возвращаемого значения ID. Я, хотя это добавление литой, исправит это:

(float)[item selectedHeight] 

но он не работает.

Что я делаю неправильно? (Я подозреваю, что проблема связана с разрешением указателей, связанных с идентификатором, но я не могу найти соответствующую документацию).

ответ

34

Вы хотите [[item selectedHeight] floatValue], считая, что selectedHeight возвращает NSNumber.

1

Вам необходимо ознакомиться с декларацией вашего метода selectedHeight. Проблема заключается в том, что метод возвращает указатель на объект (id), или вы не импортировали заголовочный файл для item в файл, содержащий фрагмент кода, поэтому Xcode предполагает, что это указатель по умолчанию.

Вы не можете наложить указатель на поплавок, так как они принципиально несовместимы. Как только вы получите свои декларации, вы должны быть в порядке.

1

Компилятор делает такие предположения, когда несколько классов объявляют методы с тем же именем, которые возвращают разные типы. Поскольку ваша переменная «item» вводится как «id», компилятор не знает, какой из этих классов будет отправлять сообщение во время выполнения, и выбирает один из них.

Чтобы избежать этой проблемы, вы можете сообщить компилятору, что класс «элемент» является экземпляром, объявляя его с определенным типом вместо родового «ID»:

SomeItemClass *item; 

Вы могли бы также избежать это не объявление одинаково названных методов, возвращающих разные типы.

5

Я знаю, что ниже код работает для iOS 6 SDK. Я предполагаю, что объект obj содержит значение поплавка.

id obj; 
float fVal; 

fVal = [obj floatValue];