2015-08-03 2 views
5

С новым xcode7 компании Apple представила дженерики и допустимость пустых для Objective-C (Developer guide)Как правильно использовать дженерики на obj-c?

Но это, кажется, очень отличается от того, что мы имеем на стрижа.

допустимость пустых:

- (nonnull NSString *)something { 
    return nil; 
} 

Это должно вызвать предупреждение! И вы даже можете присвоить возвращаемое значение этого метода до nonnull переменной как:

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

obj.name = [obj something]; 

Дженерики: Глядя этот пример:

@property (nonatomic, strong, nonnull) NSMutableArray <UIView *> *someViews; 

предупреждение возникает, когда что-то другое от UIView вставляется в массив

[self.someViews addObject:@"foobar"]; //<- this raises an error 

но не в этом случае:

self.someViews = [@[@"foobar"] mutableCopy]; 

ни в этом случае:

NSString *str = [self.someViews firstObject]; 

Так что вопрос, я использую генериков и допустимость пустых в неправильном направлении или они находятся далеко от Swift реализации?

+0

Кажется, что нет «правильного» использования дженериков и допустимости. В конкретном случае они предлагают только некоторые предупреждения, и они более полезны для связи с намерением разработчика. – IgnazioC

+0

Я думаю, что это должен быть запрос функции, поскольку это похоже на то, что статический анализатор может поймать. – Moxy

ответ

1
self.someViews = [@[@"foobar"] mutableCopy]; 

mutableCopy наследуется от NSObject, где она объявлена ​​вернуть id. Он не объявляется NSArray и NSArray не определяет тип возврата.

NSString *str = [self.someViews firstObject]; 

Это делает дать предупреждение для меня.

Смежные вопросы