我列出了许多这样的属性数据,但我希望将其写得更加整洁。您会建议用什么方式写出整洁的东西?我拥有的 property 数据比这些还多。

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

我必须具有属性,因为我正在视图控制器之间传递数据。

最佳答案

简短答案:

The iOS Developer Collections Reference

整个故事:

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

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

例如,假设我们有一个名为“PassingData” (GitHub link)的应用程序。我将定义一个包含我们的数据的类,在这种情况下,是几个“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]);
      }
}

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

这只是访问另一个对象中数据的一种方式。其他强大的竞争者是委托协议,通知和回调块。通常,如果您直接访问另一个类中的数据,则可能正在做以下三件事之一:
  • 合成:创建一个包含几个对象的类,这些对象存在以帮助父类。
  • 访问单例。单例类是可通用访问的类,只能实例化一次。它们存在争议,但是有适当的用例。
  • 在对象中存储临时状态。

  • 如果要对一种以上的数据建模,请考虑将值(数组,字符串,数字等)嵌套在字典中。但是,并非总是如此。我不希望我所有的类都具有一个NSDictionary属性。用你最好的判断。

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

    真正值得您花些时间来熟悉约定和Cocoa Design Patterns。罗莎好运!

    10-08 07:43
    查看更多