Цель C. Присвоение int для плавания - PullRequest
12 голосов
/ 20 апреля 2011

Извините за такой общий вопрос, но какой самый лучший (максимально быстрый и безопасный) метод преобразования int в float в ObjC:

Первый

int b = 10;
float a = [[NSNumber numberWithInt: b] floatValue]

Будет NSNumber экземпляр и сообщения numberWithInt, floatValue будут отправлены, верно?

Второй

int b = 10;
float a = (float) b;

C-style: это с вызовом какой-то подпрограммы?

Или каким-то другим способом?

И почему?

Ответы [ 3 ]

12 голосов
/ 20 апреля 2011

Приведение типа C-стиля является самым ясным и легким для чтения. Если бы мне удалось найти код, который создал объект NSNumber просто для того, чтобы он выполнил преобразование, у меня возникло бы удивление: «Почему он сделал это таким образом? Что-то здесь происходит, кроме простого преобразования старых типов? не хватает? "

Что касается скорости, я подозреваю, что простое преобразование типов также будет быстрее - объект NSNumber должен будет выполнять почти те же самые операции, чтобы выполнить преобразование, и имеет дополнительные накладные расходы на создание объекта и обмен сообщениями сверху. того, что. Но, как и во всех таких случаях, не угадай - измерить. Профилируйте свой код, чтобы увидеть, является ли конверсия узким местом, достаточно значительным, чтобы быть достойным вашего внимания.

5 голосов
/ 20 апреля 2011

Поскольку вы спрашиваете о безопасности, в первую очередь вам нужно проверить, соответствует ли значение вашего int значению float. В противном случае вы молча теряете данные. Если значение не очень мало, оно не подходит. Я бы переключился на использование double, чтобы вам не пришлось об этом беспокоиться, а затем просто сделайте назначение:

double d;
d = i;

Редко можно использовать переменные типа float, например short ...

2 голосов
/ 20 апреля 2011

Я действительно не вижу необходимости в NSNumber объекте, когда доступна прямая трансляция между двумя числовыми примитивами.Класс NSNumber не предназначен для преобразования типов.

...