【问题标题】:ObjectiveC Parse Integer from StringObjective C 从字符串中解析整数
【发布时间】: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]];

标签: iphone objective-c string int


【解决方案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:@":"];

_returnedArgumentsNSStrings 的数组,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] 是第三个参数。没有任何东西被传递给属性。
  • 我将方法名称声明为错误......推断代码试图做什么......
【解决方案4】:

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

【讨论】:

  • 不一定是对象。他可能错误地将方法声明为采用int*——事实上,这对我来说似乎很可能,因为许多编写 Objective-C 而不学习 C 基础知识的人认为参数类型只包含星号作为他们的语法。
  • 是的,不正确。你想要的只是 int (或者更好的是,NSInteger,这是一回事)。您只需要在objective-c 对象之前使用* 符号,并且int 不是对象,它是原始数据类型。因此,将方法签名更改为 (int) 或 (NSInteger),它应该会修复它。
【解决方案5】:

请记住,国际用户可能会使用 . 以外的小数分隔符,在这种情况下,在字符串上使用 intValue 时值可能会混淆或变为 nil。

例如,在英国,1.23 写成 1,23,因此用户将输入数字 1.7771,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);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2017-03-02
    • 2010-09-21
    • 2010-10-16
    • 2011-10-27
    相关资源
    最近更新 更多