Требуется разъяснение о правилах свойств, объявленных в протоколах

У меня есть несколько вопросов о свойствах, объявленных в протоколах.

Возвращаемый тип дисперсии

@protocol IHaveProperties

@required

@property (nonatomic, strong) IAmOfTypeX *propertyOfProtocolType;
@property (nonatomic, strong) NSArray *array;

@end

@interface ClassThatHasProperties : NSObject<IHaveProperties>

@property (nonatomic, strong) ImplementationOfTypeX *propertyOfProtocolType;
@property (nonatomic, strong) NSMutableArray *array;

@end

Итак, я попробовал это с комбинацией протокола / класса и к моему огорчению, это скомпилировано.

Как это работает? Разве это технически не соответствует интерфейсу?

Модификаторы объявления свойств

@protocol IHaveProperty

@required

@property (nonatomic, strong, readonly) *example;

@end

@interface HaveProperty : NSObject<IHaveProperty>

@property (nonatomic, strong, readonly) *example;

@end

Мой Mac перезагружается прямо сейчас, поэтому я не могу попробовать это, но я думаю, что все будет в порядке, потому что в объявлении протокола ничего нет. Все модификаторы не будут интересны для вызывающей стороны, только для класса, реализующего протокол.

1 ответ

Если вы посмотрите на <NSObject> Протокол, вы можете видеть, что он содержит методы и свойства вместе:

@protocol NSObject

- (BOOL)isEqual:(id)object; @property (readonly) NSUInteger hash;

@property (readonly) Class superclass;
- (Class)class OBJC_SWIFT_UNAVAILABLE("use 'anObject.dynamicType' instead");
- (instancetype)self;

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

- (BOOL)isProxy;

- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

- (BOOL)respondsToSelector:(SEL)aSelector;

- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

- (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

@property (readonly, copy) NSString *description; @optional @property
(readonly, copy) NSString *debugDescription;

@end

Вы должны были использовать description или же superclass свойства. Нет разницы в том, как обрабатывается свойство по сравнению с функцией. Класс, реализующий протокол, будет предоставлять средство получения и / или установки свойства протокола. И точно так же класс, которому принадлежит объект делегата, вызвал бы его свойства как: self.delegate.propertyName.

Другие вопросы по тегам