ObjectiveC Parse Integer dari String


119

Saya mencoba mengekstrak string (yang berisi integer) dari array dan kemudian menggunakannya sebagai int dalam suatu fungsi. Saya mencoba mengubahnya menjadi int menggunakan intValue.

Ini kode yang saya coba.

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

Saya mendapatkan kesalahan ini:

melewatkan argumen 3 dari 'logsIn :::' membuat pointer dari integer tanpa cast

Apa yang salah?


Saya kira Anda tidak membutuhkan (int)bagian
rano

2
Bagaimana cara login ::: dideklarasikan? terutama jenis apa dari parameter ke-3 yang diharapkan?
Vladimir

Memang benar bahwa Anda tidak membutuhkannya, tetapi itu tidak akan menyebabkan kesalahan yang dia lihat.
Chuck

2
Karena penasaran, kamu berasal dari bahasa apa? Saya telah melihat sekelompok orang mengajukan pertanyaan Objective-C pada SO di mana mereka telah membuat panggilan metode yang terlihat seperti loggedIn:::metode Anda , yang jelas merupakan cara yang tidak Objective-C untuk melakukan sesuatu.
kubi

1
Tidak, ini benar-benar loggedIn:::. Sisa dari deklarasi itu hanyalah nama parameter, bukan bagian dari selector. Idiomatis, itu seharusnya - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. Dan kemudian Anda akan menyebutnya sebagai [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Jawaban:


267

Saya benar-benar tidak tahu apa yang sulit tentang pertanyaan ini, tetapi saya berhasil melakukannya dengan cara ini:

[myStringContainingInt intValue];

Perlu dicatat bahwa Anda juga dapat melakukan:

myStringContainingInt.intValue;


2
Hanya untuk kami noobs di luar sana yang berasal dari bahasa lain, [myStringContainingInt intValue];juga dapat ditulis sepertimyStringContainingInt.intValue;
ToddBFisher

5
Apa yang terjadi jika angka di dalamnya myStringContainingIntterlalu besar untuk muat di dalam 32 bit - sebenarnya 31 bit sejak ditandatangani?
Josh Hinman

Anda harus menggunakan longValue dalam kasus ini
dulgan

1
longLongValue tepatnya
Leo Flaherty

5
Penting untuk diperhatikan bahwa Anda -[NSString intValue]mungkin tidak berperilaku persis seperti yang Anda harapkan. Dari dokumen : Properti ini adalah 0 jika string tidak dimulai dengan representasi teks desimal yang valid dari sebuah angka. Misalnya, [@" 2 asdghjk" intValue]akan kembali 2.
zekel

8

Anda bisa mengonversi string seperti itu [str intValue] atau [str integerValue]

integerValue Mengembalikan nilai NSInteger teks penerima.

  • (NSInteger) integerValue Return Value Nilai NSInteger teks penerima, mengasumsikan representasi desimal dan melewatkan spasi di awal string. Mengembalikan 0 jika penerima tidak dimulai dengan representasi teks desimal yang valid dari sebuah angka.

untuk informasi lebih lanjut lihat di sini


3
Anda menjawab ini setelah banyak jawaban untuk hal yang sama sudah ada di sini?
Christian Stewart

7
Apakah kamu bercanda? Bagaimana jika stringnya adalah "0"? Apakah ini kesalahan atau penguraian yang benar? Agak menyedihkan bahwa Apple membenci pengecualian, karena di sinilah tepatnya Anda membutuhkannya.
phreakhead

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

_returnedArgumentsadalah larik NSStringsyang diharapkan UITextField textproperti. Tidak perlu mengkonversi.

Kesalahan sintaks:

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

Jika _appDelegate Anda memiliki passwordFieldproperti, Anda dapat menyetel teks menggunakan yang berikut ini

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

Saya pikir Anda telah terlempar secara radikal oleh nama metode yang aneh dan doa yang ditulis dengan canggung. Properti tidak "mengharapkan string" (apa pun artinya) - passwordField.textadalah argumen kedua untuk loggedIn:::metode dan [[_returnedArguments objectAtIndex:2] intValue]merupakan argumen ketiga. Tidak ada yang dikirimkan ke properti.
Chuck

saya menyatakan nama metode kesalahan .. menyimpulkan apa yang coba dilakukan kode ...
falconcreek

0

Pada dasarnya, parameter ketiga di loggedIntidak boleh berupa bilangan bulat, harus berupa objek tertentu, tetapi kami tidak dapat mengetahui secara pasti karena Anda tidak menamai parameter dalam pemanggilan metode. Berikan tanda tangan metode sehingga kami dapat melihat dengan pasti. Mungkin itu membutuhkan NSNumberatau sesuatu.


1
Itu tidak harus menjadi sebuah objek. Dia bisa saja secara keliru menyatakan metode tersebut sebagai mengambil int*- pada kenyataannya, itu tampaknya sangat mungkin bagi saya, karena banyak orang yang menulis Objective-C tanpa mempelajari dasar-dasar C menganggap bahwa tipe parameter hanya menyertakan bintang sebagai bagian dari sintaks mereka.
Chuck

Ya, itu tidak benar. Yang Anda inginkan hanyalah int (atau lebih baik lagi, NSInteger, yang merupakan hal yang sama). Anda hanya perlu tanda * sebelum objek objektif-c, dan int bukanlah objek, itu adalah tipe data primitif. Jadi ubah tanda tangan metode menjadi hanya (int) atau (NSInteger), dan itu harus memperbaikinya.
Jorge Israel Peña

0

Perlu diingat bahwa pengguna internasional mungkin menggunakan pemisah desimal selain .dalam hal ini nilai dapat tercampur atau menjadi nol saat menggunakan intValuepada string.

Misalnya di Inggris 1.23ditulis 1,23, jadi nomornya 1.777akan diinput oleh user as 1,777, yang mana, tidak .intValueakan (dipotong).17771


Saya telah membuat makro yang akan mengubah teks input menjadi NSNumber berdasarkan argumen lokal yang bisa nihil (jika nihil menggunakan perangkat lokal saat ini).

#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]);\
})()\
)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.