如何在obj-c上正确使用泛型?

Ign*_*ioC 5 generics nullable objective-c ios xcode7

使用新的xcode7 Apple为Objective-C引入了泛型和可空性(开发者指南)

但它似乎与我们在swift上的情况大不相同.

为空性:

- (nonnull NSString *)something {
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

这应该引发警告!您甚至可以将此方法的返回值分配给nonnull变量,如:

//@property (copy, nonnull) NSString *name

obj.name = [obj something]; 
Run Code Online (Sandbox Code Playgroud)

泛型: 看这个例子:

@property (nonatomic, strong, nonnull) NSMutableArray <UIView *> *someViews;
Run Code Online (Sandbox Code Playgroud)

当在阵列上插入与UIView不同的内容时,会引发警告

[self.someViews addObject:@"foobar"]; //<- this raises an error
Run Code Online (Sandbox Code Playgroud)

但在这种情况下不是:

self.someViews = [@[@"foobar"] mutableCopy];
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

NSString *str = [self.someViews firstObject];
Run Code Online (Sandbox Code Playgroud)

所以问题是,我是以错误的方式使用泛型和可空性,还是远离Swift实现?

new*_*cct 1

self.someViews = [@[@"foobar"] mutableCopy];
Run Code Online (Sandbox Code Playgroud)

mutableCopy继承自NSObject,并声明返回id。它没有被NSArray专门声明,并且NSArray不决定返回类型。

NSString *str = [self.someViews firstObject];
Run Code Online (Sandbox Code Playgroud)

确实给了我一个警告。