Ответ 1
вы хотите [[item selectedHeight] floatValue]
, считая, что selectedHeight возвращает NSNumber
.
У меня возникли проблемы с этим кодом:
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]
но это не сработает.
Что я делаю неправильно? (Я подозреваю, что проблема связана с разрешением указателей, связанных с идентификатором, но я не могу найти соответствующую документацию).
вы хотите [[item selectedHeight] floatValue]
, считая, что selectedHeight возвращает NSNumber
.
Я знаю, что ниже код работает для iOS 6 SDK. Я предполагаю, что объект obj содержит значение float.
id obj;
float fVal;
fVal = [obj floatValue];
Вам нужно посмотреть объявление вашего метода selectedHeight
. Проблема заключается в том, что метод возвращает указатель на объект (id), или вы не импортировали заголовочный файл для item
в файл, содержащий фрагмент кода, поэтому Xcode предполагает его указатель по умолчанию.
Вы не можете наложить указатель на float, поскольку они принципиально несовместимы. Как только вы получите ваши заявления, выпрямитесь, хотя с вами все будет в порядке.
Компилятор делает такие предположения, когда несколько классов объявляют методы с тем же именем, которые возвращают разные типы. Поскольку ваша переменная "item" вводится как "id", компилятор не знает, какой из этих классов будет отправлять сообщение во время выполнения, и выбирает один.
Чтобы избежать этой проблемы, вы можете сообщить компилятору, какой класс "элемент" является экземпляром, объявив его конкретным типом вместо общего "id":
SomeItemClass *item;
Вы также можете избежать этого, не объявляя идентично-именованные методы, которые возвращают разные типы.