Цель C. Литье int для плавания
Извините за такой общий вопрос, но какой лучший (как можно быстрее и самый безопасный) метод для преобразования int в float в ObjC:
Первая
int b = 10;
float a = [[NSNumber numberWithInt: b] floatValue]
Будет экземпляр NSNumber
, а сообщения numberWithInt
, floatValue
будут отправлены, правильно?
Второй
int b = 10;
float a = (float) b;
C-стиль: это с вызовом некоторой подпрограммы?
Или каким-то другим способом?
И почему?
Ответы
Ответ 1
Сводка типа C является самой чистой и простой для чтения. Если бы мне удалось найти код, который создал объект NSNumber
, просто чтобы он сделал преобразование, это оставило бы меня вопросом: "Почему он так поступил? Что-то происходит здесь, кроме простого преобразования старого типа? не хватает?"
Что касается скорости, я подозреваю, что простое преобразование типов также было бы быстрее - объект NSNumber
должен будет выполнять практически те же операции для преобразования, и имеет дополнительные накладные расходы на создание объектов и обмен сообщениями сверху того, что. Но, как и во всех таких случаях, не угадывайте - измеряйте. Профилируйте свой код, чтобы узнать, является ли конверсия узким местом, которое достаточно значимо, чтобы быть достойным вашего внимания.
Ответ 2
Поскольку вы спрашиваете о безопасности, первое, что вам нужно проверить, заключается в том, соответствует ли значение вашего int
в float
. В противном случае вы без потерь теряете данные. Если значение не очень мало, оно не подходит. Я бы переключился на использование double
, поэтому вам не нужно беспокоиться об этом, а затем просто выполните назначение:
double d;
d = i;
Редко использование переменных типа float
, как и short
...
Ответ 3
Я действительно не вижу необходимости в объекте NSNumber
, когда доступен прямой тип между двумя числовыми примитивами. Класс NSNumber
не был предназначен только для преобразования типов.