Можно преобразовать NSString в двойное с
double myDouble = [myString doubleValue];
, Округление к самому близкому интервалу может тогда быть сделано как
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
, я честно не уверен, существует ли более оптимизированный способ преобразовать назад в строку, чем
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
На самом деле это прекрасный пример зла попытки перегрузить возвращаемый тип магическими значениями и просто сомнительным дизайном интерфейса.
Одно решение, которое я мог бы использовать, чтобы устранить двусмысленность (и таким образом, необходимость в «поведении, подобном исключению») в этом примере состоит в том, чтобы определить правильный тип возвращаемого значения:
struct stack{
double* pData;
uint32 size;
};
struct popRC{
double value;
uint32 size_before_pop;
};
popRC pop(struct stack* pS){
popRC rc;
rc.size=pS->size;
if(rc.size){
--pS->size;
rc.value=pS->pData[pS->size];
}
return rc;
}
Использование, конечно, следующее:
popRC rc = pop(&stack);
if(rc.size_before_pop!=0){
....use rc.value
Это происходит ВСЕ время, но в C ++, чтобы избежать такой двусмысленности, обычно просто возвращается
std::pair<something,bool>
, где bool - это индикатор успеха - посмотрите на некоторые из:
std::set<...>::insert
std::map<...>::insert
В качестве альтернативы добавьте double *
в интерфейс и верните код возврата (n UNOVERLOADED!), Скажем, перечисление, указывающее на успех.
Конечно, не нужно было возвращать размер в struct popRC
. Это могло быть
enum{FAIL,SUCCESS};
, но поскольку размер может служить полезной подсказкой для публики »