программно добавьте, что свойство делает Объект ActionScript (метапрограммирование)

Можно преобразовать NSString в двойное с

double myDouble = [myString doubleValue];

, Округление к самому близкому интервалу может тогда быть сделано как

int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

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

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
6
задан Jacob Poul Richardt 3 August 2009 в 08:15
поделиться

1 ответ

На самом деле это прекрасный пример зла попытки перегрузить возвращаемый тип магическими значениями и просто сомнительным дизайном интерфейса.

Одно решение, которое я мог бы использовать, чтобы устранить двусмысленность (и таким образом, необходимость в «поведении, подобном исключению») в этом примере состоит в том, чтобы определить правильный тип возвращаемого значения:

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};

, но поскольку размер может служить полезной подсказкой для публики »

15
ответ дан 8 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: