Objective C 从字符串中解析整数
Posted
技术标签:
【中文标题】Objective C 从字符串中解析整数【英文标题】:ObjectiveC Parse Integer from String 【发布时间】:2011-04-03 07:29:17 【问题描述】:我正在尝试从数组中提取字符串(包含整数),然后将其用作函数中的 int。我正在尝试使用 intValue 将其转换为 int。
这是我一直在尝试的代码。
NSArray *_returnedArguments = [serverOutput componentsSeparatedByString:@":"];
[_appDelegate loggedIn:usernameField.text:passwordField.text:(int)[[_returnedArguments objectAtIndex:2] intValue]];
我收到此错误:
传递 'loggedIn:::' 的参数 3 使指针从整数 没有演员表
怎么了?
【问题讨论】:
我猜你不需要(int)
部分
loggedIn::: 是如何声明的?特别是它期望的第三个参数是什么类型的?
确实你不需要它,但这不会导致他看到的错误。
出于好奇,您来自什么语言?我看到很多人在 SO 上提出 Objective-C 问题,他们在哪里进行了看起来像您的 loggedIn:::
方法的方法调用,这显然是一种非 Objective-C 的做事方式。
不,确实是loggedIn:::
。该声明的其余部分只是参数名称,而不是选择器的一部分。习惯上,它应该是- (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId
。然后你可以称它为[_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]];
。
【参考方案1】:
我真的不知道这个问题有什么难的,但我设法做到了:
[myStringContainingInt intValue];
需要注意的是,你也可以这样做:
myStringContainingInt.intValue;
【讨论】:
对于我们这些来自其他语言的菜鸟来说,[myStringContainingInt intValue];
也可以写成myStringContainingInt.intValue;
如果myStringContainingInt
中的数字太大而无法容纳在 32 位中——实际上是 31 位,因为它已签名,会发生什么情况?
在这种情况下你应该使用 longValue
确切地说是longLongValue
请务必注意,-[NSString intValue]
的行为可能与您的预期不同。来自docs:如果字符串不是以数字的有效十进制文本表示开头,则此属性为 0。 例如,[@" 2 asdghjk" intValue]
将返回 2
。【参考方案2】:
你可以像 [str intValue] 或 [str integerValue] 那样转换字符串
整数值 返回接收者文本的 NSInteger 值。
(NSInteger)整数值 返回值 接收者文本的 NSInteger 值,假设为十进制表示并在字符串的开头跳过空格。如果接收者不是以数字的有效十进制文本表示开头,则返回 0。更多信息请参考here
【讨论】:
你在同一件事的大量答案已经在这里后回答这个问题? 你在开玩笑吗?如果字符串是“0”怎么办?是错误还是正确的解析?有点遗憾的是,Apple 厌恶异常,因为这正是您需要它们的地方。【参考方案3】: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]
是第三个参数。没有任何东西被传递给属性。
我将方法名称声明为错误......推断代码试图做什么......【参考方案4】:
基本上,loggedIn
中的第三个参数不应该是整数,它应该是某种对象,但我们无法确定,因为您没有在方法调用中命名参数。提供方法签名,以便我们可以确定。也许需要NSNumber
或其他东西。
【讨论】:
不一定是对象。他可能错误地将方法声明为采用int*
——事实上,这对我来说似乎很可能,因为许多编写 Objective-C 而不学习 C 基础知识的人认为参数类型只包含星号作为他们的语法。
是的,不正确。你想要的只是 int (或者更好的是,NSInteger,这是一回事)。您只需要在objective-c 对象之前使用* 符号,并且int 不是对象,它是原始数据类型。因此,将方法签名更改为 (int) 或 (NSInteger),它应该会修复它。【参考方案5】:
请记住,国际用户可能会使用 .
以外的小数分隔符,在这种情况下,在字符串上使用 intValue
时值可能会混淆或变为 nil。
例如,在英国,1.23
写成 1,23
,因此用户将输入数字 1.777
为 1,777
,而 .intValue
将是 1777
而不是 1
(截断)。
我制作了一个宏,它将基于可以为 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]);\
)()\
)
【讨论】:
【参考方案6】:如果我理解正确,您需要将您的NSString
转换为int
?试试这种和平的代码:
NSString *stringWithNumberInside = [_returnedArguments objectAtIndex:2];
int number;
sscanf([stringWithNumberInside UTF8String], "%x", &flags);
【讨论】:
NSString 确实有一个intValue
方法。 developer.apple.com/iphone/library/documentation/cocoa/…以上是关于Objective C 从字符串中解析整数的主要内容,如果未能解决你的问题,请参考以下文章
如何在Objective C中使用XML解析发布带有特殊字符和泰语的字符串?