本文介绍了Objective-C泛型不工作的方法? (Xcode 7 Beta(build:7A120f))的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,很明显,在WWDC之后我在玩上周的新东西。正如你所知苹果向Objective-C的世界引入泛型

我在方法中尝试过这个代码,效果非常好

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

[array addObject:@];
[array addObject:@(54)];不兼容的指针类型发送'NSNumber *'到类型'NSString * __nonnull'的参数
//很好,泛型像预期的一样工作。但是我也有方法转换为泛型


$ b


$ b

在标题文件中:

   - (NSArray< NSString *> *)objectsToSearch;实施:

  

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

NSString * second = @2;

NSString * third = @3;

NSNumber * test = @(55);

return @ [first,second,third,test]; //无错误!
}

我做错了事或Clang不支持泛型+文字,

解决方案

我刚刚诊断了这一点,我不认为这是一个错误。以下代码显示了各种选项以及为什么每个都将编译或不编译。 注意:这是基于我的猜测,如何工作。

  #pragma clang诊断推送
#pragma clang diagnostic ignored-Wunused-variable
- (void)testGenericArrays {

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

NSArray< NSString *> * arr1 = @ [aString,aNumber];
//编译,因为RHS在编译时是一个非类型数组。

NSArray< NSString *> * arr2 = @ [aString,@(20)];
//编译,因为RHS在编译时是一个非类型数组。

NSArray< NSString *> * arr3 = [NSArray< NSString *> arrayWithObjects:aString,aNumber,@(20),nil];
//编译,因为arrayWithObjects的类型擦除只键入第一个参数,它是一个NSString。
//其余的参数是一个vaList,在头处理期间不检查。

NSArray< NSString *> * arr4 = [NSArray< NSString *> arrayWithObjects:@(20),nil]; //< - Error!
NSArray< NSString *> * arr5 = [NSArray< NSString *> arrayWithObjects:aNumber,nil]; //< - Error!
//这两个都不编译,因为第一个参数现在是NSNumber并且被检查。

NSArray< NSString *> * arr6 = [NSArray< NSString *> arrayWithObject:aNumber]; //< - Error!
//不会编译,因为在头处理期间检查了参数。

NSArray< NSString *> * arr7 = [NSArray arrayWithObject:aNumber];
//编译,因为RHS在编译时是一个非类型数组。

NSMutableArray< NSString *> * arr8 = [[NSMutableArray alloc] init];
[arr8 addObject:aNumber]; //< - Error!
//不编译,因为LHS是一个类型数组,我们正在添加它。
}
#pragma clang诊断pop

随意剪切和粘贴到单元测试,并自己尝试。


So, obviously, after WWDC I'm playing with new stuff presented during last week. As you know Apple introduced generics to the world of Objective-C

I tried this code in method, works great

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.

However I also have method I want to transform to generics

In header file:

- (NSArray <NSString*> *)objectsToSearch;

Implementation:

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

    NSString *second = @"2";

    NSString *third = @"3";

    NSNumber *test = @(55);

    return @[first, second, third, test]; // No-error!!!
}

Am I doing something wrong or Clang does not support generics + literals or there is something else I'm missing?

解决方案

I've just been diagnosing this some more and I don't think this is a bug. The following code shows a variety of options and why each will or will not compile. Note: This is based on my guesses as to how things work. It may be different to how Apple would explain it.

#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

Hope this clarifies things for people. Feel free to cut and paste into a unit test and try it out for yourself.

这篇关于Objective-C泛型不工作的方法? (Xcode 7 Beta(build:7A120f))的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 09:14