ObjectiveC Dizeden Tamsayı Ayrıştırma


119

Bir diziden (bir tamsayı içeren) bir dizeyi ayıklamaya ve sonra onu bir işlevde int olarak kullanmaya çalışıyorum. İntValue kullanarak bunu bir int'e dönüştürmeye çalışıyorum.

İşte denediğim kod.

  NSArray *_returnedArguments = [serverOutput componentsSeparatedByString:@":"];
  [_appDelegate loggedIn:usernameField.text:passwordField.text:(int)[[_returnedArguments objectAtIndex:2] intValue]];

Bu hatayı alıyorum:

'loggedIn :::' argümanının 3 geçişi bir çevrim olmadan tamsayıdan işaretçi yapar

Sorun nedir?


Sanırım (int)parçaya ihtiyacın yok
rano

2
LoggedIn ::: nasıl bildirilir? özellikle 3. parametrenin ne tür olmasını bekliyor?
Vladimir

İhtiyacın olmadığı doğru, ancak bu onun gördüğü hataya yol açmaz.
Chuck

2
Meraktan, hangi dilden geliyorsun? Yönteminize benzeyen yöntem çağrıları yaptıkları SO'da Objective-C soruları soran çok sayıda insan gördüm loggedIn:::, ki bu da kesinlikle Amaç-C olmayan bir şeyler yapma yolu.
kubi

1
Hayır, gerçekten öyle loggedIn:::. Bu bildirimin geri kalanı, seçicinin bir parçası değil, yalnızca parametre adlarıdır. Deyimsel olarak, öyle olmalı - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. Ve sonra siz onu çağırırsınız [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Yanıtlar:


267

Bu soruda neyin zor olduğunu gerçekten bilmiyorum ama şu şekilde yapmayı başardım:

[myStringContainingInt intValue];

Şunları da yapabileceğiniz unutulmamalıdır:

myStringContainingInt.intValue;


2
Sadece bizim için başka dillerden gelenler, [myStringContainingInt intValue];şu şekilde de yazılabilirmyStringContainingInt.intValue;
ToddBFisher

5
İçindeki sayı myStringContainingInt32 bitin içine sığamayacak kadar büyükse ne olur - aslında imzalandığından beri 31 bit?
Josh Hinman

Bu durumda longValue kullanmalısınız
dulgan

1
longLongValue kesin olmak gerekirse
Leo Flaherty

5
-[NSString intValue]Tam olarak beklediğiniz gibi davranmayabileceğinizi unutmamak önemlidir . Gönderen docs : dize Bir sayının geçerli bir ondalık metin gösterimi ile başlayacak yoksa bu özellik 0 olduğunu. Örneğin, [@" 2 asdghjk" intValue]geri dönecek 2.
zekel

8

Dizeyi şöyle dönüştürebilirsiniz [str intValue] veya [str integerValue]

integerValue Alıcının metninin NSInteger değerini döndürür.

  • (NSInteger) integerValue Return Value Alıcının metninin NSInteger değeri, ondalık gösterimi varsayarak ve dizenin başındaki boşlukları atlayarak. Alıcı, bir sayının geçerli bir ondalık metin gösterimiyle başlamazsa 0 döndürür.

daha fazla bilgi için buraya bakın


3
Buna zaten burada aynı şey için tonlarca cevap olduktan sonra mı cevap veriyorsun?
Christian Stewart

7
Benimle dalga mı geçiyorsun? Ya dize "0" ise? Bu bir hata mı yoksa doğru bir çözümleme mi? Apple'ın istisnalardan uzak durması üzücü çünkü burası tam da ihtiyacınız olan yer.
phreakhead

1
NSArray *_returnedArguments = [serverOutput componentsSeparatedByString:@":"];

_returnedArgumentsbir dizidir NSStringsveUITextField text özelliği bekliyor. Dönüştürmeye gerek yok.

Sözdizimi hatası:

[_appDelegate loggedIn:usernameField.text:passwordField.text:(int)[[_returnedArguments objectAtIndex:2] intValue]];

_AppDelegate'inizin bir passwordFieldözelliği varsa, aşağıdakileri kullanarak metni ayarlayabilirsiniz

[[_appDelegate passwordField] setText:[_returnedArguments objectAtIndex:2]];

Tuhaf yöntem adı ve garip bir şekilde yazılmış çağrı tarafından kökten atıldığını düşünüyorum. Özellik "bir dizge beklemiyor" (ne anlama gelirse gelsin) - yöntemin passwordField.textikinci argümanı loggedIn:::ve [[_returnedArguments objectAtIndex:2] intValue]üçüncü argümandır. Bir mülke hiçbir şey aktarılmıyor.
Chuck

yöntem adını bir hata olarak
bildiriyorum

0

Temel olarak, içindeki üçüncü parametre loggedInbir tamsayı olmamalıdır, bir tür nesne olmalıdır, ancak kesin olarak bilemeyiz çünkü yöntem çağrısındaki parametreleri adlandırmadınız. Kesin olarak görebilmemiz için yöntem imzasını sağlayın. Belki bir NSNumberfalan alır .


1
Bir nesne olması gerekmiyor. Yanlışlıkla yöntemi bir alıyormuş gibi ilan edebilirdi int*- aslında bu bana oldukça muhtemel görünüyor, çünkü C'nin temellerini öğrenmeden Objective-C yazan birçok insan parametre türlerinin sadece sözdizimlerinin bir parçası olarak yıldızları içerdiğini varsayıyor.
Chuck

Evet, yanlış. İstediğiniz şey sadece int (veya daha iyisi, NSInteger, aynı şey). Object-c nesnelerinden önce yalnızca * işaretlerine ihtiyacınız var ve int bir nesne değil, ilkel bir veri türüdür. Bu nedenle, yöntem imzasını yalnızca (int) veya (NSInteger) olarak değiştirin ve düzeltmesi gerekir.
Jorge Israel Peña

0

Uluslararası kullanıcıların ondalık ayırıcı kullanabileceğini unutmayın; .bu durumda değerler karışabilir veya kullanılırken sıfır olabilirintValue , bir dizede .

Örneğin, Birleşik Krallık'ta 1.23yazılır 1,23, bu nedenle sayı 1.777kullanıcı tarafından olarak girilir 1,777, bu .intValueda olduğu 1777gibi 1(kesilmeyecektir).


Giriş metnini, sıfır olabilen bir yerel ayar argümanına dayalı olarak bir NSNumber'a dönüştürecek bir makro yaptım (eğer sıfırsa, aygıt mevcut yerel ayarını kullanır).

#define stringToNumber(__string, __nullable_locale) (\
(^NSNumber *(void){\
NSLocale *__locale = __nullable_locale;\
if (!__locale) {\
__locale = [NSLocale currentLocale];\
}\
NSString *__string_copy = [__string stringByReplacingOccurrencesOfString:__locale.groupingSeparator withString:@""];\
__string_copy = [__string_copy stringByReplacingOccurrencesOfString:__locale.decimalSeparator withString:@"."];\
return @([__string_copy doubleValue]);\
})()\
)

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.