ObjectiveC Parse Integer จาก String


119

ฉันกำลังพยายามดึงสตริง (ซึ่งมีจำนวนเต็ม) จากอาร์เรย์แล้วใช้เป็น int ในฟังก์ชัน ฉันกำลังพยายามแปลงเป็น int โดยใช้ intValue

นี่คือรหัสที่ฉันพยายาม

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

ฉันได้รับข้อผิดพลาดนี้:

การส่งอาร์กิวเมนต์ 3 ของ 'loggedIn :::' ทำให้ตัวชี้จากจำนวนเต็มโดยไม่ต้องใช้ cast

มีอะไรผิดปกติ


ฉันเดาว่าคุณไม่จำเป็นต้องมี(int)ส่วน
rano

2
LoggedIn ::: ถูกประกาศอย่างไร? โดยเฉพาะประเภทของพารามิเตอร์ที่ 3 ที่คาดหวัง?
Vladimir

เป็นเรื่องจริงที่คุณไม่จำเป็นต้องใช้ แต่นั่นจะไม่นำไปสู่ข้อผิดพลาดที่เขาเห็น
Chuck

2
คุณมาจากภาษาอะไรด้วยความอยากรู้อยากเห็น ฉันเคยเห็นคนจำนวนหนึ่งถามคำถาม Objective-C เกี่ยวกับ SO ซึ่งพวกเขาได้ทำการเรียกเมธอดที่ดูเหมือนloggedIn:::วิธีของคุณซึ่งเป็นวิธีที่ไม่เป็นไปตามวัตถุประสงค์ -C ในการทำสิ่งต่างๆ
kubi

1
loggedIn:::ไม่มีมันคือเรื่องจริง ส่วนที่เหลือของการประกาศนั้นเป็นเพียงชื่อพารามิเตอร์ไม่ใช่ส่วนหนึ่งของตัวเลือก idiomatically - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userIdมันควรจะเป็น [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];และจากนั้นคุณจะเรียกมันว่าเป็น
Chuck

คำตอบ:


267

ฉันไม่รู้จริงๆว่าคำถามนี้หนักหนาอะไร แต่ฉันสามารถทำได้ด้วยวิธีนี้:

[myStringContainingInt intValue];

ควรสังเกตว่าคุณสามารถทำได้:

myStringContainingInt.intValue;


2
สำหรับพวกเรา noobs ที่มาจากภาษาอื่น ๆ[myStringContainingInt intValue];ก็สามารถเขียนได้เช่นmyStringContainingInt.intValue;
ToddBFisher

5
จะเกิดอะไรขึ้นเมื่อตัวเลขภายในmyStringContainingIntใหญ่เกินกว่าที่จะใส่ภายใน 32 บิต - จริงๆแล้ว 31 บิตนับตั้งแต่มีการลงนาม
Josh Hinman

คุณควรใช้ longValue ในกรณีนี้
dulgan

1
longLongValue ให้แม่นยำ
Leo Flaherty

5
สิ่งสำคัญคือต้องสังเกตว่าคุณ-[NSString intValue]อาจมีพฤติกรรมไม่ตรงตามที่คุณคาดหวัง จากเอกสาร : คุณสมบัตินี้จะเป็น 0 หากสตริงไม่ได้ขึ้นต้นด้วยการแสดงตัวเลขทศนิยมที่ถูกต้อง ยกตัวอย่างเช่นจะกลับมา[@" 2 asdghjk" intValue] 2
zekel

8

คุณสามารถแปลงสตริงเช่นนั้น [str intValue] หรือ [str integerValue]

integerValue ส่งคืนค่า NSInteger ของข้อความของผู้รับ

  • (NSInteger) integerValue Return Value ค่า NSInteger ของข้อความของผู้รับโดยสมมติว่าเป็นตัวแทนทศนิยมและข้ามช่องว่างที่จุดเริ่มต้นของสตริง ส่งคืน 0 หากผู้รับไม่ได้ขึ้นต้นด้วยการแสดงตัวเลขทศนิยมที่ถูกต้อง

สำหรับข้อมูลเพิ่มเติมโปรดดูที่นี่


3
คุณตอบคำถามนี้หลังจากมีคำตอบมากมายสำหรับสิ่งเดียวกันอยู่ที่นี่แล้ว?
Christian Stewart

7
คุณล้อเล่นฉัน? จะเกิดอะไรขึ้นถ้าสตริงเป็น "0"? เป็นข้อผิดพลาดหรือการแยกวิเคราะห์ที่ถูกต้อง? น่าเศร้าที่ Apple ยกเลิกข้อยกเว้นเนื่องจากนี่คือสถานที่ที่คุณต้องการ
phreakhead

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

_returnedArgumentsคืออาร์เรย์NSStringsที่UITextField textคุณสมบัติคาดหวัง ไม่ต้องแปลง.

ข้อผิดพลาดทางไวยากรณ์:

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

หาก _appDelegate ของคุณมีpasswordFieldคุณสมบัติคุณสามารถตั้งค่าข้อความโดยใช้สิ่งต่อไปนี้

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

ฉันคิดว่าคุณถูกโยนทิ้งอย่างรุนแรงด้วยชื่อวิธีการแปลก ๆ และการเรียกร้องที่เขียนขึ้นอย่างเชื่องช้า คุณสมบัติไม่ใช่ "คาดว่าสตริง" (ไม่ว่าจะหมายถึงอะไรก็ตาม) - passwordField.textเป็นอาร์กิวเมนต์ที่สองของloggedIn:::วิธีการและ [[_returnedArguments objectAtIndex:2] intValue]เป็นอาร์กิวเมนต์ที่สาม ไม่มีการส่งต่อไปยังคุณสมบัติ
Chuck

ฉันประกาศชื่อเมธอดว่ามีข้อผิดพลาด .. อนุมานว่าโค้ดกำลังพยายามทำอะไร ...
falconcreek

0

โดยทั่วไปพารามิเตอร์ที่สามในloggedInไม่ควรเป็นจำนวนเต็มควรเป็นวัตถุบางชนิด แต่เราไม่สามารถทราบได้อย่างแน่นอนเนื่องจากคุณไม่ได้ตั้งชื่อพารามิเตอร์ในการเรียกใช้เมธอด ระบุลายเซ็นของวิธีการเพื่อให้เราเห็นได้อย่างแน่นอน บางทีอาจต้องใช้เวลาNSNumberหรือบางอย่าง


1
ไม่จำเป็นต้องเป็นวัตถุเสมอไป เขาอาจจะประกาศเมธอดโดยไม่ถูกต้องว่ารับint*- อันที่จริงดูเหมือนว่าจะค่อนข้างเป็นไปได้สำหรับฉันเนื่องจากหลาย ๆ คนที่เขียน Objective-C โดยไม่ได้เรียนรู้พื้นฐานของ C ถือว่าประเภทพารามิเตอร์มีเพียงดาวเป็นส่วนหนึ่งของไวยากรณ์เท่านั้น
Chuck

ใช่มันไม่ถูกต้อง สิ่งที่คุณต้องการก็แค่ int (หรือดีกว่าก็ NSInteger ซึ่งก็เหมือนกัน) คุณต้องมีเครื่องหมาย * ก่อนวัตถุวัตถุประสงค์ -C เท่านั้นและ int ไม่ใช่วัตถุเป็นชนิดข้อมูลดั้งเดิม ดังนั้นเปลี่ยนลายเซ็นวิธีเป็นเพียง (int) หรือ (NSInteger) และควรแก้ไข
Jorge Israel Peña

0

โปรดทราบว่าผู้ใช้ระหว่างประเทศอาจใช้ตัวคั่นทศนิยมนอกเหนือจากที่.ในกรณีนี้ค่าอาจผสมกันหรือกลายเป็นศูนย์เมื่อใช้intValueกับสตริง

ตัวอย่างเช่นในสหราชอาณาจักร1.23มีการเขียน1,23หมายเลขดังนั้นผู้ใช้1.777จะป้อนหมายเลข1,777ซึ่งตามที่.intValueจะ1777ไม่เป็น1(ตัดทอน)


ฉันได้สร้างมาโครที่จะแปลงข้อความอินพุตเป็น NSNumber ตามอาร์กิวเมนต์โลแคลซึ่งอาจเป็นศูนย์ (ถ้าไม่มีก็ใช้ตำแหน่งที่ตั้งปัจจุบันของอุปกรณ์)

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

-1

ถ้าฉันเข้าใจคุณถูกต้องคุณต้องแปลงNSStringเป็นint? ลองใช้ความสงบของรหัสนี้:

NSString *stringWithNumberInside = [_returnedArguments objectAtIndex:2];
int number;
sscanf([stringWithNumberInside UTF8String], "%x", &flags);

4
NSString มีintValueวิธีการ developer.apple.com/iphone/library/documentation/cocoa/…
Chuck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.