Как мне добавить id в float?

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

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]

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

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

Ответы

Ответ 1

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

Ответ 2

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

id obj;
float fVal;

fVal = [obj floatValue];

Ответ 3

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

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

Ответ 4

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

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

SomeItemClass *item;

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