Как совместить преимущества `int` и` NSInteger` - PullRequest
2 голосов
/ 26 августа 2011

Казалось бы, простой вопрос: могу ли я иметь какой-то объект Number, который может быть nil, но который я могу назначить как примитив int:

вот так:

NSNumber *n = nil; 
n = 3; 

if(n == nil){ 
    // some actions... 
} else if (n == 1){ 
    // some actions... 
} else { 
    // some actions... 
}

Спасибодля вашего ввода

Ответы [ 4 ]

6 голосов
/ 26 августа 2011

Ответ НЕТ.Если переменная является объектом, вы можете либо назначить другой объект,

n = anotherNSNumber;

, либо установить значение с помощью properties или методами ,

n = [NSNumber numberWithInt:3];

и сравните объект с другим объектом,

if (n == anotherNSNumber) // Checks the reference

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

if (([n intValue] == 3) || ([n intValue] == [anotherNSNumber intValue]))
3 голосов
/ 26 августа 2011

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

NSNumber *nObject = [NSNumber numberWithInt:3]; 
int n = nObject.intValue; // Zero if nObject is nil

if(nObject == nil){ 
    // some actions... 
} else if (n == 1){ 
    // some actions... 
} else { 
    // some actions... 
}
1 голос
/ 26 августа 2011

Не так, как вы думаете, что можете. Нет.

когда вы говорите:

NSNumber *n = nil;

что вы говорите: объявите указатель, который указывает на объект NSNumber, но пока он указывает на nil Это нормально; потому что позже вы можете получить указатель на объект NSNumber, а затем присвоить его этой переменной, чтобы n был указателем, а не действительным объектом NSNumber.

С вашей следующей строкой:

n = 3;

Вы не присваиваете значение объекту, но говорите, что n указывает на адрес 3. Который не является адресом и который не содержит объекта.

1 голос
/ 26 августа 2011

Нет, вы не можете.Причина этого в том, что nil является указателем на адрес 0x0, то есть nil == 0.Таким образом, вы не сможете устранить неоднозначность между 0 и nil.

Не говоря уже о том, что они также должны быть разных типов.nil используется в качестве указателя, в то время как число, подобное 0 или 3. является скаляром.

nil определяется как

#define nil NULL

Типичное определение NULL выглядит следующим образом:

#define NULL ((void *)0)
...