我有一堆像这样列出的属性数据,但我希望写得更整洁。你会用什么方式来写这个整理器?我有比这些更多的房产数据。
@property (strong,nonatomic) NSString *energyEnhancer;
@property (strong,nonatomic) NSString *energyEnhancer1;
@property (strong,nonatomic) NSString *energyEnhancer2;
@property (strong,nonatomic) NSString *energyEnhancer3;
我必须拥有属性,因为我在视图控制器之间传递数据。
答案 0 :(得分:3)
答案简短:
The iOS Developer Collections Reference
整个故事:
我认为更好地了解一些处理collections的基础课程,例如NSArray
,NSSet
,NSDictionary如果你感觉特别深奥,CFBag
。
你的问题表明你可以从阅读一般的Cocoa模式中受益。实际上,你可以将任何东西从一个物体传递到另一个物体。 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。 Lotsa运气好!
答案 1 :(得分:2)
我认为你最好不要传递一个字典,而不是像一些答案那样使用NSArray。这比数组更健壮,因为您可以使用字典的键来确保获得正确的值而不是依赖于数组中的顺序。
答案 2 :(得分:1)
你可以这样写..
@property (strong,nonatomic) NSString *energyEnhancer,*energyEnhancer1,*energyEnhancer2,*energyEnhancer3;
答案 3 :(得分:0)
@property (strong, nonatomic) NSMutableArray *energyEnhancers;
会更好。