我列出了许多这样的属性数据,但我希望将其写得更加整洁。您会建议用什么方式写出整洁的东西?我拥有的 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。罗莎好运!