NSInteger'ı int'e nasıl dönüştürebilirim?


97

Örneğin, böyle valuebir NSIntegerörneğe mesaj iletirken

[a value] EXC_BAD_ACCESS'e neden olur.

Peki nasıl bir dönüştürmek NSIntegeriçin int?

Eğer ilgiliyse, sadece 32'den küçük sayılar kullanılır.


2
Kafanız oldukça karışık görünüyor. [bir değer], a'nın bir nesne olmasını beklediğinizi, ancak şu anda bir NSInteger olduğunu belirtir. Bir int türüne "dönüştürmek" bu sorunu çözmez.
Mike Abdullah

Yanıtlar:


205

Ta da:

NSInteger myInteger = 42;
int myInt = (int) myInteger;

NSInteger32/64 bitlik bir int'den başka bir şey değildir. (çalıştırdığınız işletim sistemine / platforma bağlı olarak uygun boyutu kullanacaktır)


13
Kesin olarak, NSInteger'ın 32 bit platformlarda bir int ve 64 bit platformlarda uzun olduğunu düşünüyorum.
Frédéric Adda

5
Önerilen "dönüştürme" yi kullanarak bir uyarı alıyorum: Örtülü dönüştürme tamsayı hassasiyetini kaybediyor: 'NSUInteger' (aka 'unsigned long') 'int'
djcj

@djcj, evet, yeni SDK'lar için yanıt doğru değil. Bence.
Azik Abdullah

NSInteger'ın önüne (int) koymak çok daha kolay olmaz mıydı? Örneğin, yeni bir değişken oluşturmanıza gerek kalmaması için tamsayı formunu her çağırmak istediğinizde (int) myInteger.
chandhooguy

2
@chandhooguy neden yeni bir değişkenden kaçınmaya çalışıyorsunuz?
Dan Rosenstark

28

Bu satır içi yapmak istiyorsanız, sadece döküm NSUIntegerveya NSIntegerbir etmek int:

int i = -1;
NSUInteger row = 100;
i > row // true, since the signed int is implicitly converted to an unsigned int
i > (int)row // false

1
Sadece meraktan soruyorum, neden çift haneli oylarla zaten kabul edilmiş bir cevabı olan bir soruya 2 yıl sonra bir cevap gönderiyorsunuz? Özellikle de seninki bu cevabın sadece yeniden ifade edilmesi olduğu için.
Lily Ballard

6
Çünkü cevabım tek bir satırdır (satır içi tipte cast kullanarak - (int)), ki bu OP'nin isteyebileceğini düşünüyorum. Buna kendim baktım ve konuyla ilgili tüm cevapların çok çizgili olduğunu fark ettim.
Samuel Clay

2
Kabul edilen cevap, tek bir satır kullanılarak örtük bir dönüşümü gösterir. Abizern'in cevabı, bir NSIntegerdeğeri yerine bir int. Her iki durumda da çok hatlı bir çözüm değildir.
Lily Ballard

25
Daha net olmalıydım. Bu biraz acemi bir soru olduğu için, acemi programcı için bir (int) ifadesi ile satır içi dönüştürebilecekleri açık olmayabilir. Diğer cevaplar bunu göstermiyor ve bence bu sayfada tökezleyen herkese yardımcı oluyor.
Samuel Clay

4
Ve bir buçuk yıl sonra bu sayfaya tökezledim, özellikle NSUInteger ile ilgili kadroya ihtiyacım vardı . Teşekkürler Samuel!
leanne

18

Ben bir dönüştürmek için gereken şartlar hakkında emin değilim NSIntegerbir etmek int.

NSInteger yalnızca bir typedef:

NSInteger 32 bitlik veya 64 bitlik bir sistem için oluşturduğunuzdan bağımsız olarak bir tamsayıyı tanımlamak için kullanılır.

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

Kullandığınız NSIntegerherhangi bir yeri intdönüştürmeden kullanabilirsiniz .


2
NSUinteger'ı int: değer karşılaştırmalarına dönüştürmek için iyi bir neden. (int i = -1)> (NSUinteger j = 14) int'i işaretsiz olarak çevirir, yani -1> 14, ki bu sizin istediğiniz şey değildir.
Samuel Clay

1
@SamuelClay. Belirli durumlarda kullanıldığında iyi bir nokta. Şahsen, NSUInteger'ı uint'e dönüştürürdüm. Ancak. Soru NSUInteger'ı değil, NSInteger'ı dönüştürmekle ilgiliydi.
Abizern

Genel bir tuzağı göstermek için yalnızca işaretsiz bir int kullandım. Cevabımın da gösterdiği gibi, her ikisi için de aynı tip döküm. Bu zor bir problem değil, ancak yeterince yaygın ve henüz kimsenin tek satırlık bir cevap önerdiğini görmedim.
Samuel Clay

0

UIsegmentedControl'de yaygın olarak kullanılan "hata", 32 bit yerine 64 bit olarak derlenirken görünür, yeni bir değişkene aktarmamanın kolay yolu bu ipuçlarını kullanmaktır, ekleyin (int) :

[_monChiffre setUnite:(int)[_valUnites selectedSegmentIndex]];

onun yerine :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.