ObjectiveC从字符串解析整数


119

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

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

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

我收到此错误:

传递'loggedIn :::'的参数3使指针从整数转换而无需强制转换

怎么了?


我想您不需要这个(int)部分
rano

2
如何声明login :::?尤其是期望的第三种参数类型?
弗拉基米尔

的确,您不需要它,但这不会导致他看到的错误。
Chuck

2
出于好奇,您来自什么语言?我见过很多人在SO上问Objective-C问题,他们在哪里进行了看起来像您的loggedIn:::方法的方法调用,这绝对是非Object-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

Answers:


267

我真的不知道这个问题有什么难的,但是我设法做到了:

[myStringContainingInt intValue];

请注意,您还可以执行以下操作:

myStringContainingInt.intValue;


2
对于我们来说,来自其他语言的[myStringContainingInt intValue];myStringContainingInt.intValue;
菜鸟

5
当内部数字myStringContainingInt太大而无法容纳32位(实际上是有符号的31位)时,会发生什么?
乔什·辛曼

在这种情况下,您应该使用longValue
dulgan 2014年

1
longLongValue准确无误
Leo Flaherty

5
重要的是要注意,您的-[NSString intValue]行为可能并不完全符合您的期望。来自docs如果字符串不是以数字的有效十进制文本开头,则此属性为0。例如,[@" 2 asdghjk" intValue]将返回2
zekel 2015年

8

您可以只将字符串转换为[str intValue]或[str integerValue]

integerValue返回接收者文本的NSInteger值。

  • (NSInteger)integerValue返回值接收者文本的NSInteger值,假定为十进制表示形式,并在字符串的开头跳过空格。如果接收方不是以数字的有效十进制文本开头,则返回0。

欲了解更多信息,请点击这里


3
您已经在同一件事的大量答案之后回答了吗?
克里斯汀·斯图尔特

7
你在跟我开玩笑吗?如果字符串为“ 0”怎么办?是错误还是正确的解析?Apple讨厌例外,这有点令人遗憾,因为这正是您需要它们的地方。
phreakhead 2013年

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 2010年

0

基本上,in中的第三个参数loggedIn不应为整数,而应为某种对象,但由于您未在方法调用中命名参数,因此我们无法确定。提供方法签名,以便我们可以肯定地看到。也许需要一个NSNumber或一个东西。


1
它不一定是对象。他可能会错误地声明该方法采用int*-实际上,这对我来说似乎很可能,因为许多在不了解C基础知识的情况下编写Objective-C的人都认为参数类型仅将星号作为其语法的一部分。
Chuck

是的,这是不正确的。您想要的只是int(或者更好的是NSInteger,这是同一件事)。您只需要在Objective-C对象之前加*号,并且int不是对象,它是原始数据类型。因此,将方法签名更改为(int)或(NSInteger),并且应该对其进行修复。
豪尔赫·以色列·佩尼亚

0

请记住,国际用户可能会使用小数点分隔符.,否则intValue在字符串上使用时,值可能会混淆或变成零。

例如,在英国1.23被写入1,23,所以数量1.777将是由用户作为输入1,777,其中,因为.intValue,将17771(截断)。


我已经制作了一个宏,该宏将根据可以为nil的语言环境参数将输入文本转换为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]);\
})()\
)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.