Как я могу бросить идентификатор на поплавок? - PullRequest
15 голосов
/ 21 ноября 2008

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

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]

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

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

Ответы [ 4 ]

37 голосов
/ 21 ноября 2008

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

6 голосов
/ 19 октября 2012

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

id obj;
float fVal;

fVal = [obj floatValue];
1 голос
/ 21 ноября 2008

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

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

SomeItemClass *item;

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

1 голос
/ 21 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...