Objective-C泛型不适用于方法?(Xcode 7 Beta(版本:7A120f))

lvp*_*lvp 7 generics objective-c clang

所以,显然,在WWDC之后,我正在玩上周提出的新内容.如您所知,Apple在Objective-C世界中引入了泛型

注意:这个答案以某种方式跟进了这个问题: Objective-C中是否存在强类型集合?

我在方法中尝试了这个代码,效果很好

NSMutableArray<NSString*> *array = [[NSMutableArray alloc] init];

[array addObject:@""];
[array addObject:@(54)];Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString * __nonnull'
// Great, generics works as expected.
Run Code Online (Sandbox Code Playgroud)

但是我也有想要转换为泛型的方法

在头文件中:

- (NSArray <NSString*> *)objectsToSearch;
Run Code Online (Sandbox Code Playgroud)

执行:

- (NSArray <NSString*> *)objectsToSearch
{
    NSString *first = @"1";

    NSString *second = @"2";

    NSString *third = @"3";

    NSNumber *test = @(55);

    return @[first, second, third, test]; // No-error!!!
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么或Clang不支持泛型+文字或者还有其他我缺少的东西?

dre*_*kka 12

我刚刚诊断了这个,我不认为这是一个错误.以下代码显示了各种选项以及为什么每个都将编译或不编译.注意:这是基于我对事情如何运作的猜测.它可能与Apple如何解释它有所不同.

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
-(void) testGenericArrays {

    NSString *aString = @"abc";
    NSNumber *aNumber = @(55);

    NSArray<NSString *> *arr1  = @[aString, aNumber];
    // Compiles because the RHS is an un-typed array at compilation time.

    NSArray<NSString *> *arr2  = @[aString, @(20)];
    // Compiles because the RHS is an un-typed array at compilation time.

    NSArray<NSString *> *arr3 = [NSArray<NSString *> arrayWithObjects:aString, aNumber, @(20), nil];
    // Compiles because the type erasure for arrayWithObjects only types the first argument which is a NSString.
    // The rest of the arguments are a vaList which is not checked during header processing.

    NSArray<NSString *> *arr4 = [NSArray<NSString *> arrayWithObjects:@(20), nil]; // <- Error!
    NSArray<NSString *> *arr5 = [NSArray<NSString *> arrayWithObjects:aNumber, nil]; // <- Error!
    // Neither of these two compile because the first argument is now a NSNumber and is checked.

    NSArray<NSString *> *arr6 = [NSArray<NSString *> arrayWithObject:aNumber]; // <- Error!
    // Doesn't compile because the argument is checked during header processing.

    NSArray<NSString *> *arr7 = [NSArray arrayWithObject:aNumber];
    // Compiles because the RHS is an un-typed array at compilation time.

    NSMutableArray<NSString *> *arr8 = [[NSMutableArray alloc] init];
    [arr8 addObject:aNumber]; // <- Error!
    // Doesn't compile because the LHS is a typed array and we are adding to it.
}
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

希望这能为人们澄清事情.随意剪切并粘贴到单元测试中并自行尝试.