【问题标题】:casting NSInteger into NSString将 NSInteger 转换为 NSString
【发布时间】:2012-03-13 08:03:53
【问题描述】:

我正在尝试用几个不同的部分制作一个字符串。下面是我现在所拥有的。我的代码中没有任何错误,但是一旦我运行它并执行触发它的事件,我就会得到EXC_BAD_ACCESS。还有另一种方法可以将此NSInteger 转换为NSString

NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

part1=@"some";
part2=@"text";    

tempString = [NSString stringWithFormat:@"%@%@%@%@", 
              part1,
              (NSString *)num1, 
              part2, 
              (NSString *)num2];

【问题讨论】:

  • 如果您认为其中一个答案解决了您的问题,请将其作为正确答案。

标签: objective-c ios nsstring string-formatting nsinteger


【解决方案1】:

字符串和整数是根本不同的数据类型,在这种情况下,Objective-C 中的强制转换不会为您进行转换,它只会向编译器谎报正在发生的事情(因此它会编译),但在运行时它会爆炸。

您可以使用%d 而不是%@ 将整数直接嵌入到格式字符串中:

    tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];

NSInteger 只是常规“int”(数字)的一个花哨名称。 NSString 是对字符串对象的对象引用。一些数字类型(int 和浮点)可以像这样在 C 中直接在彼此之间进行某种转换,但这两者根本不能互操作。听起来你可能来自一种更宽容的语言? :)

【讨论】:

    【解决方案2】:

    Ben Zotto 于 2012 年 2 月 22 日 22:34 回答:

    字符串和整数是根本不同的数据类型,并且 在这种情况下,使用 Objective-C 进行转换不会为您进行转换, 它只会向编译器谎报正在发生的事情(所以它编译) 但在运行时它会爆炸。

    您可以使用 %d 将整数直接嵌入到格式字符串中 而不是 %@:

    tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
    

    NSInteger 只是普通“int”的一个花哨名称 (数字)。 NSString 是对字符串对象的对象引用。一些 数字类型(整数和浮点)可以进行某种转换 像这样直接在C中相互之间,但这两个不是 完全可以互操作。听起来你可能来自更多 宽容的语言? :)

    "记住@"%d" 只能在 32 位上工作。一旦你开始使用 NSInteger 来实现兼容性,如果你曾经为 64 位平台编译过,你应该使用@"%ld" 作为你的格式说明符。 " by Marc Charbonneau

    所以,解决方案:

    tempString = [NSString stringWithFormat:@"%@%ld%@%ld", part1, (long)num1, part2, (long)num2];
    

    来源:String Programming Guide for Cocoa - String Format Specifiers(需要 iPhone 开发者注册)

    【讨论】:

    • 几乎正确。如果您只使用 %ld 格式化程序,则无需将数字显式转换为 long。
    • 在 Xcode 5.1.1 中,如果在使用 %ld 格式化程序时 NSInteger 值未强制转换为 (long),则会生成警告。
    【解决方案3】:

    对于整数,您必须使用 %d 而不是 %@

    所以,[NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2]; 是格式化字符串的正确代码。

    希望对你有帮助。

    【讨论】:

      【解决方案4】:
      NSString* tempString = [NSString stringWithFormat:@"%@%d%d", part1, num1, num2];
      

      【讨论】:

        【解决方案5】:

        尝试以下方法:

         tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,(NSString *)num1, part2, (NSString *)num2];
        

        【讨论】:

          【解决方案6】:

          NSIntegers 是实际整数 - 不是 NSObject 派生的对象。试试:

          tempString = [NSString stringWithFormat:@"%@%d%@%d", part1, num1, part2, num2];
          

          试图将NSInteger 强制转换为NSString* 的演员也很危险,并且可能是您崩溃的实际原因。编译器让你侥幸逃脱,因为它相信你知道你在用这种类型的转换语句做什么。

          【讨论】:

            【解决方案7】:
            NSString *part1, *part2, *tempString;
            
            NSInteger num1;
            NSInteger num2;
            
            part1=@"some";
            part2=@"text";
            
            tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
            NSLog(@"%@",tempString);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-12-04
              • 2015-05-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-20
              • 2016-08-11
              相关资源
              最近更新 更多