【问题标题】:Would adding the intValue from an NSNumber alter an NSString in any way?从 NSNumber 添加 intValue 会以任何方式改变 NSString 吗?
【发布时间】:2011-01-01 18:05:22
【问题描述】:

我正在动态构建一个 url,需要一种将 NSNumber 的 intValue 添加到其末尾的方法。

NSNumber *hatId = [NSNumber NumberWithInt:25]
NSMutableString* theUrlString = [[NSMutableString alloc] init];
[theUrlString appendFormat:@"http://www.website.com/SelectHat/%d", [hatid intValue]];
NSURL *url = [NSURL URLWithString:theUrlString];

完成上述操作后,简单的单元测试或 NSLog 将显示结果看起来有效

http://www.website.com/SelectHat/25

但我的问题是——以这种方式连接会改变 NSString,所以它不再像我期望的那样是一个有效的字符串吗?这也是构建需要来自 NSNumber 的 intValue 的字符串的“好”方法吗?

更新

我只是想确保 %d 内联没有问题,并且 NSString 符合我的预期。我遇到的问题有点复杂,所以我会把它留到另一个问题上。感谢您对 NSURL / NSNumber / int 的回复,因为我仍在学习很多关于 Objective-c 的知识

【问题讨论】:

  • 也不需要使用alloc/init。只需theUrlString = [NSString stringWithFormat: @"..... %d", hadId]

标签: iphone objective-c concatenation


【解决方案1】:
NSNumber *hatId = [NSNumber NumberWithInt:25]
NSMutableString* theUrlString = [[NSMutableString alloc] init];
[theUrlString appendFormat:@"http://www.website.com/SelectHat/%d", [hatid intValue]];
NSURL *url = [NSURL URLWithString:theUrlString];

上面可以很容易地简化为一行代码:

NSURL *url = [NSURL URLWithString: [NSString stringWithFormat: @"http://www.website.com/SelectHat/%d", 25]];
  • 除非你真的想要,否则不需要创建 NSNumber

  • 无需单独分配/初始化字符串

  • 根本不需要使用可变字符串

而且,不,修改可变字符串不会使字符串无效。

【讨论】:

  • 如果您要对 hatID 进行硬编码,您可以将其缩短:NSURL *url = [NSURL URLWithString:@"http://www.website.com/SelectHat/25"];
  • 是的——我有点假设 25 会有一个变量......但是,是的。
【解决方案2】:

我很好奇为什么您认为将内容附加到可变字符串会使该字符串无效。如果您遇到问题,请分享实际出了什么问题。

[theUrlString appendFormat:@"http://www.website.com/SelectHat/%d", [hatid intValue]];

是修改 NSMutableString 的有效方法。

由于您正在构建一个 URL,您可能希望直接使用 NSURL。查看 +URLWithString:realtiveToURL: 和 -URLByAppendingPathComponent: 作为构建 NSURL 的方法。这些方法很方便,因为它们可以防止您在想要“SelectHat/25”时意外创建以“SelectHat25”或“SelectHat//25”结尾的字符串。

现在把字符串和 URL 放在一边

NSNumber* hatid = 25;

无效。那是创建一个指向 NSNumber 对象的指针并将其分配给一个 int 值。您将在内存地址“25”处寻找一个 NSNumber 对象,谁知道您会在那里找到什么。您应该构造一个 NSNumber 的实例,或者只使用 int 类型。

NSNumber* hatid = [[NSNumber alloc] initWithUnsignedInteger:25];

NSUInteger hatid = 25

【讨论】:

    【解决方案3】:

    为什么你认为这会产生一个“无效”的字符串?使用 appendFormat 方法只需根据需要扩展可变字符串。

    就它是否是构建字符串的好方法而言 - 如果您预先准备好所有信息,您可以通过 initWithFormat 方法简单地创建一个新的(非可变的)字符串。也就是说,你所做的并没有错。 (也就是说,没有必要使用 NSNumber - 一个标准的 int 就可以了。你也没有像@Abizern 在他的回答中说明的那样正确初始化 NSNumber。)

    【讨论】:

      【解决方案4】:

      这一行是错误的

      NSNumber* hatid = 25;
      

      NSNumber 是一个对象。你不能像那样初始化它。试试这个:

      NSNumber *hatId = [NSNumber NumberWithInt:25]
      

      至于您的问题 - 只要您正确创建它,NSString 就是一个 NSString。但是,是否有任何理由将数字保留为 NSNumber 而不是字符串?

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2012-06-01
        • 1970-01-01
        • 2017-01-03
        • 1970-01-01
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多