3

我有一堆像这样列出的属性数据,但我希望把它写得更整洁。你建议用什么方法来写这个更整洁?我有比这些更多的财产数据。

@property (strong,nonatomic) NSString *energyEnhancer;
@property (strong,nonatomic) NSString *energyEnhancer1;
@property (strong,nonatomic) NSString *energyEnhancer2;
@property (strong,nonatomic) NSString *energyEnhancer3;

我必须拥有财产,因为我在视图控制器之间传递数据。

4

4 回答 4

3

简短的回答:

iOS 开发者集合参考


整个故事:

我认为更广泛地了解一些处理集合的 Foundation 类是一个好主意,例如NSArrayNSSetNSDictionary,如果您感觉特别深奥,CFBag.

您的问题表明您可以从阅读一般 Cocoa 模式中受益。事实上,您几乎可以将任何东西从一个对象传递到另一个对象。一个NSArray实例当然与几个实例没有什么不同NSString

例如,假设我们有一个名为“PassingData” (GitHub 链接)的应用程序。我将定义一个包含我们数据的类,在这种情况下,是几个“energyEnhancer”字符串。

@interface PDDataSource : NSObject

@property (nonatomic, strong) NSString *engergyEnhancer;
@property (nonatomic, strong) NSString *engergyEnhancer2;
@property (nonatomic, strong) NSString *engergyEnhancer3;

@end

然后在我们的视图控制器中,我们可能会尝试访问能量增强器,如下所示:

- (void)logDataSourceWithStrings {

    NSLog(@"Energy enhancer 1: %@", self.dataSource.energyEnhancer);
    NSLog(@"Energy enhancer 2: %@", self.dataSource.energyEnhancer2);
    NSLog(@"Energy enhancer 3: %@", self.dataSource.energyEnhancer3);
}

另一种方法是这样的:

- (void)logDataSourceWithArray {

    for(NSInteger i = 0; i < self.dataSource.enhancers.count; i++) {
        NSLog(@"Enhancer %i: %@", i, self.dataSource.enhancers[i]);
      }
}

使用数组的另一个好处是您不再受编译时声明的变量数量的限制。您的游戏或健身应用程序变得更加强大。

这只是访问另一个对象中的数据的一种方式。其他强有力的竞争者是委托协议、通知和回调块。通常,如果您直接访问另一个类中的数据,您可能会做以下三件事之一:

  1. 合成:创建一个包含多个对象的类,这些对象可以帮助父类。
  2. 访问单例。单例类是普遍可访问的类,只能实例化一次。它们是有争议的,但有适当的用例。
  3. 在对象中存储临时状态。

如果要对不止一种数据进行建模,请考虑将值(无论是数组、字符串、数字或其他)嵌套在字典中。不过,情况并非总是如此。我不希望我的所有课程都有一个NSDictionary属性。用你最好的判断。

建模时的另一个好策略是使用 Xcode 中的 plist 编辑器来模拟对象。然后,您可以在代码中创建一个与 plist 匹配的类(或多个类)。

真正值得您花时间熟悉约定和Cocoa 设计模式。好运!

于 2013-08-30T16:42:45.520 回答
2

与其像某些答案所建议的那样使用 NSArray ,我认为您最好通过字典。这比数组更健壮,因为您可以使用字典的键来确保获得正确的值,而不是依赖于数组中的顺序。

于 2013-08-30T16:45:30.423 回答
1

可以这样写。。

@property (strong,nonatomic) NSString *energyEnhancer,*energyEnhancer1,*energyEnhancer2,*energyEnhancer3;
于 2013-08-30T16:44:08.353 回答
0
@property (strong, nonatomic) NSMutableArray *energyEnhancers;

会更好。

于 2013-08-30T16:36:04.577 回答