Objective-C 解析字符串中的整数

123

我试图从一个数组中提取包含整数的字符串,然后将其作为int类型在函数中使用。我尝试使用intValue将其转换为int。

这是我一直在尝试的代码。

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

我遇到了这个错误:

passing argument 3 of 'loggedIn:::' makes pointer from integer without a cast

出了什么问题?


我猜你不需要(int)这部分。 - rano
2
loggedIn:::是如何声明的?特别是它期望的第三个参数是什么类型? - Vladimir
虽然你不需要它,但那不会导致他看到的错误。 - Chuck
2
出于好奇,你来自哪个语言?我在SO上看到了一些人提出Objective-C问题,其中他们进行的方法调用看起来像你的loggedIn:::方法,这是一种明显不符合Objective-C方式的做法。 - kubi
1
不,它确实是 loggedIn:::。该声明的其余部分只是参数名称,而不是选择器的一部分。按照习惯用法,它应该是 - (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId。然后您可以将其调用为 [_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]]; - Chuck
显示剩余3条评论
6个回答

271

我不知道这个问题有什么难的,但是我用以下方式解决了它:

[myStringContainingInt intValue];

需要注意的是,你也可以这样做:

myStringContainingInt.intValue;


2
对于那些来自其他编程语言的新手,[myStringContainingInt intValue];也可以写成myStringContainingInt.intValue; - ToddBFisher
5
myStringContainingInt内的数字太大,无法适应32位(实际上是31位,因为它带符号)时会发生什么? - Josh Hinman
在这种情况下,您应该使用longValue。 - dulgan
1
longLongValue 精确地说 - Leo Flaherty
7
需要注意的是,-[NSString intValue] 可能不会按照你的预期行事。根据文档所述:如果字符串不以有效的十进制数字文本表示开头,则此属性为0. 例如,[@" 2 asdghjk" intValue] 将返回 2 - zekel

8
你可以像这样转换字符串 [str intValue] 或者 [str integerValue]
integerValue 返回接收器文本的 NSInteger 值。
- (NSInteger)integerValue 返回值 接收器文本的 NSInteger 值,假设是十进制表示,并跳过字符串开头的空格。如果接收器不以有效的十进制数字文本表示开头,则返回 0。
如需更多信息,请参见 此处

3
你在已经有很多相同问题的回答之后回答这个问题? - Christian Stewart
7
你在开玩笑吗?如果字符串是“0”怎么办?这是一个错误还是正确的解析?很遗憾苹果公司不喜欢使用异常,因为这正是你需要它们的地方。 - 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.textloggedIn::: 方法的第二个参数,而 [[_returnedArguments objectAtIndex:2] intValue] 则是第三个参数。没有任何内容会传递到属性中。 - Chuck
我声明了方法名称错误。推断代码试图做什么… - falconcreek

0

基本上,在 loggedIn 中的第三个参数不应该是一个整数,它应该是某种对象,但我们无法确定,因为您没有在方法调用中命名参数。提供方法签名,以便我们可以确认。也许它需要一个 NSNumber 或类似的东西。


1
它不一定要是一个对象。他可能错误地将方法声明为接受 int* — 实际上,我认为这很有可能,因为许多人在没有学习 C 语言基础的情况下编写 Objective-C 代码时会假设参数类型只包括星号作为其语法的一部分。 - Chuck
是的,这是不正确的。你想要的只是 int(或者更好的是 NSInteger,它是相同的)。你只需要在 objective-c 对象前加上 * 符号,而 int 不是对象,它是一种原始数据类型。所以将方法签名更改为 (int) 或 (NSInteger),它应该就可以解决了。 - Jorge Israel Peña

0

请注意,国际用户可能使用与.不同的小数分隔符,在这种情况下,使用intValue转换字符串时,值可能会混乱或变为零。

例如,在英国,1.23写作1,23,因此用户输入1,777时,数字1.777将作为.intValue,而不是1(截断)。


我编写了一个宏,可以将输入文本转换为NSNumber,基于区域设置参数来决定。如果该参数为nil,则使用设备的当前区域设置。
#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方法。详情请参考此链接:http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/intValue - Chuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接