【问题标题】:objective-c question regarding NSString NSInteger and method calls关于 NSString NSInteger 和方法调用的objective-c问题
【发布时间】:2009-06-30 00:33:21
【问题描述】:

我喜欢通过传递一个值来创建自定义类的实例,该值将在初始化时帮助设置它。我已经覆盖了 init 并实际上将其更改为:

- (id)initWithValue:(NSInteger *)initialValue;

我想将此值存储在实例化对象的属性中,并使用该值生成将与其关联的 UIImage 的文件名。

我的问题是如何最好地在 Cocoa/Obj-C 中解决这个问题。 NSInteger 是满足我需求的最佳参数还是 NSString 会更好? 或者是否有其他设计模式?我不熟悉在这种情况下可用的所有创意方法。假设我的类属性是:

@interface MyView : UIView {
UIImage *image;
NSInteger value;

如果我坚持使用 NSInteger 作为参数,我可以轻松地将 value 分配给它。但随后需要从该值生成“image12.png”(假设 NSInteger = 12)来设置我的 UIImage。像“image”+initialValue+“.png”这样的东西。我相信在 Obj-C 中详细表达为:

NSString *myValue = @"image";
[myValue stringByAppendingString:[initialValue stringValue]]; //NSInteger may not respond to stringValue?!?
[myValue stringByAppendingString:@".png"]

这就是我对 Obj-C 的理解崩溃的地方。对我来说这样的感觉应该更容易,但我仍然感到困惑。

现在,如果 initialValue 是一个值为 @"12" 的 NSString,也许它是?然后 self.value = [initialValue integerValue];

我可以用多个 stringByAppendingString 调用构建 image。对于其他语言中如此简单的事情来说似乎很乏味。

处理此类问题的最佳方法是什么?

【问题讨论】:

    标签: objective-c cocoa cocoa-touch


    【解决方案1】:

    您的 init 方法看起来不错,如果您只处理整数值,您确实希望使用 NSInteger 而不是 NSString 甚至 NSNumber。您可能想要更改的一件事是您传递的参数应该是 (NSInteger),而不是 (NSInteger *) - NSInteger 不是对象,但在 Objective-C 中是类似于 int 的原始类型。

    您可以使用 NSString 的 stringWithFormat: 选择器来构建图像名称,如下所示:

    NSInteger myInteger = 12;
    NSString *imageString = [NSString stringWithFormat:@"image%d.png", myInteger];

    【讨论】:

      【解决方案2】:

      只是为了扩展 Tim 提到的内容,NSInteger 实际上只是一个#define。在 32 位架构上,它相当于一个 int,而在 64 位架构上,它是一个 long。

      如果您需要将整数视为对象(例如,将其放入 NSDictionary 中),您可以使用 numberWithInteger: 将其包装在 NSNumber 的实例中。

      希望有帮助!

      【讨论】:

      • 实际上有一个 numberWithInteger: 方法,因为 NSInteger 出现在 10.5 中,你也会在 NSUserDefaults 等地方看到类似的方法。
      【解决方案3】:

      要记住的另一件事是,当您处理路径时,NSString 会为您提供stringByAppendingPathExtension:stringByAppendingPathComponent:,这两者都比仅使用stringByAppendingString: 更好地处理尾部斜杠之类的事情。

      如果您再多描述一下这个对象的作用以及它正在加载的图像类型,如果我能想出一种更好的方法来创建文件名,而不是仅仅传递一个数字,那么我可能会提供一些建议。

      【讨论】:

      • 我只是从包中提取图像,所以在这种情况下我不需要担心路径名......但现在我明白了为什么会有这些 Path 方法。我想知道为什么不最好将路径名拼写为字符串。有趣的。谢谢!
      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      相关资源
      最近更新 更多