ObjectiveC phân tích cú pháp số nguyên từ chuỗi


119

Tôi đang cố gắng trích xuất một chuỗi (chứa một số nguyên) từ một mảng và sau đó sử dụng nó như một int trong một hàm. Tôi đang cố chuyển đổi nó thành int bằng cách sử dụng intValue.

Đây là mã tôi đã thử.

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

Tôi gặp lỗi này:

truyền đối số 3 của 'loggedIn :::' làm cho con trỏ từ số nguyên không có ép kiểu

Chuyện gì vậy?


Tôi đoán bạn không cần (int)phần này
rano

2
Đăng nhập ::: được khai báo như thế nào? đặc biệt là loại tham số thứ 3 mà nó mong đợi?
Vladimir

Đúng là bạn không cần nó, nhưng điều đó sẽ không dẫn đến lỗi mà anh ấy đang thấy.
Chuck

2
Vì tò mò, bạn đến từ ngôn ngữ nào? Tôi đã thấy rất nhiều người hỏi các câu hỏi Objective-C trên SO nơi họ thực hiện các cuộc gọi phương thức giống như loggedIn:::phương pháp của bạn , đó là một cách hoàn toàn không phải Objective-C để thực hiện mọi việc.
kubi,

1
Không, nó thực sự là như vậy loggedIn:::. Phần còn lại của khai báo đó chỉ là tên tham số, không phải là một phần của bộ chọn. Nói một cách thành ngữ, nó nên như vậy - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId. Và sau đó bạn sẽ gọi nó là [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];.
Chuck

Câu trả lời:


267

Tôi thực sự không biết câu hỏi này có gì khó đến vậy, nhưng tôi đã làm được theo cách này:

[myStringContainingInt intValue];

Cần lưu ý rằng bạn cũng có thể làm:

myStringContainingInt.intValue;


2
Chỉ cần cho chúng tôi noobs ngoài kia đến từ các ngôn ngữ khác, [myStringContainingInt intValue];cũng có thể được viết như thếmyStringContainingInt.intValue;
ToddBFisher

5
Điều gì sẽ xảy ra khi số bên trong myStringContainingIntquá lớn để vừa với 32 bit - thực sự là 31 bit kể từ khi nó được ký?
Josh Hinman

Bạn nên sử dụng longValue trong trường hợp này
dulgan

1
longLongValue để được chính xác
Leo Flaherty

5
Điều quan trọng cần lưu ý là bạn -[NSString intValue]có thể không cư xử chính xác như mong đợi. Từ tài liệu : Thuộc tính này là 0 nếu chuỗi không bắt đầu bằng biểu diễn văn bản thập phân hợp lệ của một số. Ví dụ, [@" 2 asdghjk" intValue]sẽ trở lại 2.
zekel

8

Bạn chỉ có thể chuyển đổi chuỗi như thế [str intValue] hoặc [str integerValue]

integerValue Trả về giá trị NSInteger của văn bản của người nhận.

  • (NSInteger) integerValue Trả về Giá trị Giá trị NSInteger của văn bản của người nhận, giả sử là biểu diễn thập phân và bỏ qua khoảng trắng ở đầu chuỗi. Trả về 0 nếu người nhận không bắt đầu bằng biểu diễn văn bản thập phân hợp lệ của một số.

để biết thêm thông tin tham khảo tại đây


3
Bạn trả lời câu này sau hàng tấn câu trả lời cho điều tương tự đã có ở đây?
Christian Stewart

7
Bạn đang đùa tôi? Nếu chuỗi là "0" thì sao? Đó là một lỗi hay một phân tích cú pháp chính xác? Thật đáng buồn khi Apple không chấp nhận các trường hợp ngoại lệ, vì đây chính xác là nơi bạn cần chúng.
phreakhead

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

_returnedArgumentslà một mảng NSStringsmà thuộc UITextField texttính đang mong đợi. Không cần chuyển đổi.

Lỗi cú pháp:

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

Nếu _appDelegate của bạn có thuộc passwordFieldtính, thì bạn có thể đặt văn bản bằng cách sử dụng

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

Tôi nghĩ rằng bạn đã hoàn toàn bị loại bỏ bởi tên phương thức kỳ lạ và lời kêu gọi được viết một cách vụng về. Thuộc tính không phải là "mong đợi một chuỗi" (bất kể điều đó có nghĩa là gì) - passwordField.textlà đối số thứ hai của loggedIn:::phương thức và [[_returnedArguments objectAtIndex:2] intValue]là đối số thứ ba. Không có gì được chuyển cho một tài sản.
Chuck

i tuyên bố phương pháp đặt tên cho một lỗi .. suy luận những gì đang cố gắng làm ...
falconcreek

0

Về cơ bản, tham số thứ ba trong loggedInkhông phải là một số nguyên, nó phải là một đối tượng của một số loại, nhưng chúng tôi không thể biết chắc chắn vì bạn đã không đặt tên cho các tham số trong lệnh gọi phương thức. Cung cấp chữ ký phương thức để chúng tôi có thể thấy chắc chắn. Có lẽ nó cần một NSNumberhoặc một cái gì đó.


1
Nó không nhất thiết phải là một đối tượng. Anh ta có thể đã khai báo nhầm phương thức là lấy một int*- trên thực tế, điều đó có vẻ khá dễ xảy ra đối với tôi, vì rất nhiều người viết Objective-C mà không học các kiến ​​thức cơ bản về C cho rằng các kiểu tham số chỉ bao gồm dấu sao như một phần trong cú pháp của họ.
Chuck

Vâng, nó không chính xác. Những gì bạn muốn chỉ là int (hoặc tốt hơn là NSInteger, điều tương tự). Bạn chỉ cần dấu * trước các đối tượng target-c và int không phải là một đối tượng, nó là một kiểu dữ liệu nguyên thủy. Vì vậy, hãy thay đổi chữ ký phương thức thành chỉ (int) hoặc (NSInteger) và nó sẽ sửa chữa nó.
Jorge Israel Peña,

0

Hãy nhớ rằng người dùng quốc tế có thể đang sử dụng dấu phân tách thập phân khác với .trường hợp này các giá trị có thể bị trộn lẫn hoặc chỉ trở thành số không khi sử dụng intValuetrên một chuỗi.

Ví dụ: ở Vương quốc Anh 1.23được viết 1,23, vì vậy số 1.777sẽ được nhập bởi người dùng dưới dạng 1,777, như .intValue, sẽ 1777không 1(bị cắt bớt).


Tôi đã tạo một macro sẽ chuyển đổi văn bản đầu vào thành NSNumber dựa trên đối số ngôn ngữ có thể là nil (nếu nil sử dụng ngôn ngữ hiện tại của thiết bị).

#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

Nếu tôi hiểu bạn một cách chính xác, bạn cần phải chuyển đổi NSStringthành int? Hãy thử mã hòa bình này:

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

4
NSString có một intValuephương thức. developer.apple.com/iphone/library/documentation/cocoa/…
Chuck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.