JSONModel: заполнение NSArray универсального типа

Я использую JSONModel в своем приложении для iOS, и у меня появилось несколько предупреждений, позвольте мне немного объяснить.

Допустим, у меня есть эта JSONModel

CTVContact.h

@interface CTVContact : JSONModel
@property (nonatomic, strong) NSArray<Optional, CTVPhone> *phone;
@end

CTVContact.m

NSMutableArray *phones = [[NSMutableArray alloc] init];
for(NSString *p in personPhones) {
    CTVPhone *phn = [[CTVPhone alloc] init];
    phn.original = p;
    [phones addObject:phn];
}    
phone = [NSArray arrayWithArray:phones];

В основном все работает как шарм, но я получаю предупреждение о следующем:

Incompatible pointer types assigning to 'NSArray<Optional,CTVEventParticipant> *' from 'NSArray *'

Как я могу обойти это предупреждение? Я не могу найти правильный способ назначить все значения массива для телефонного массива без этого предупреждения.

Заранее большое спасибо!

2 ответа

Решение

NSArray<Optional, CTVPhone> *phone; определяет переменную, которая принимает массив, который соответствует 2 протоколам. Если вы попытаетесь установить эту переменную (phone) в массив, который не утверждает, что он соответствует этим протоколам, тогда вы получите предупреждение компиляции.

phone = [NSArray arrayWithArray:phones]; просто создает "простой" массив без специальных протоколов. Так что вы получите предупреждение.

Вероятно, правильное решение - удалить протоколы из определения @property. Если у вас нет NSArray подкласс, который соответствует тем протоколам, которые вы должны использовать...

В качестве альтернативы и при условии, что вы не пытаетесь вызвать какие-либо методы, которые могут быть определены в этих протоколах:

phone = (NSArray <Optional, CTVPhone> *)[NSArray arrayWithArray:phones];

который добавляет приведение, которое в основном означает для компилятора: "поверь мне, все в порядке"...

Похоже, что он может жаловаться на вашей последней строке, так как вы проходите в NSMutableArray когда NSArray "s arrayWithArray вызов метода для NSArray, Вы можете уйти с этим по телефону copy на phones массив, как таковой:

phone = [NSArray arrayWithArray:[phones copy]];
Другие вопросы по тегам