【发布时间】:2016-01-08 12:20:44
【问题描述】:
Xcode 7 引入了泛型。它允许提示,例如:
并允许警告,例如:
但它在很多事情上都失败了,根本没有任何警告:
NSMutableArray<NSNumber *> *array;
array = [NSMutableArray<NSNumber *> arrayWithObjects:@0, @"", nil];
NSLog(@"%@", [array[1] class]);// __NSCFConstantString
array = [NSMutableArray<NSNumber *> arrayWithContentsOfURL:[NSURL URLWithString:@"http://ios.eezytutorials.com/sample-files/sample-array-plist.plist"]];
NSLog(@"%@", [array[0] class]); // __NSCFString
所以键入通用创建有点不可靠。
问题:我们应该使用不可靠的语法吗?
NSMutableArray<NSString *> *array;
array = [NSMutableArray<NSString *> array];
array = [NSMutableArray<NSString *> arrayWithArray:array];
array = [NSMutableArray<NSString *> arrayWithObjects:@"", @"", nil];
array = [NSMutableArray<NSString *> arrayWithContentsOfURL:url];
还是简化语法?
NSMutableArray<NSString *> *array;
array = [NSMutableArray array];
array = [NSMutableArray arrayWithArray:array];
array = [NSMutableArray arrayWithObjects:@"", @"", nil];
array = [NSMutableArray arrayWithContentsOfURL:url];
我还担心显然不可能对arrayWithContentsOfURL 和arrayWithContentsOfFile 的返回值提供任何编译时保证。那么泛型对那些人来说总是没用吗?
【问题讨论】:
-
如果您不确定数组将容纳什么样的对象,为什么要放松 Objective-C 的动态性?
-
这个答案或许能帮到你:stackoverflow.com/a/5198040/3222713
-
感谢@Pipiks,我理解为使用轻量级打字。
-
@AnoopVaidya 不知道数组将容纳的事物类型不是一般情况,可能是糟糕的设计。
-
对于
<NSString *>,项目应该是@"...",对于<NSNumber *>,项目应该是@(...),这就是你收到警告的原因,尽管你添加了NSNumber定义数组的项类型为NSString。
标签: objective-c generics nsarray xcode7