所以我有一個協議,這需要一個屬性聲明:爲什麼我必須聲明由協議在標題中指定的屬性,而不是類擴展(實現)
@protocol MyProtocol <NSObject>
@property MyView *myView;
@end
和實現文件(類擴展)的內部
@interface MyViewController : NSViewController <MyProtocol>
@end
但是,如果我申報財產(協議規定):對象誰符合它
@interface MyViewController()
@property MyView *myView;
@end
我得到這個錯誤:
Illegal redeclaration of property in class extension 'MyViewController' (attribute must be 'readwrite', while its primary must be 'readonly')
似乎有是解決這個問題的兩個主要SO線程:
attribute must be readwrite while its primary must be read only
和
Can't declare another window
第一個答案沒有解釋任何東西
第二個答案說,你可以通過聲明屬性中的屬性來避免這個錯誤e頭;唉
頭
@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end
實施
@interface MyViewController()
@end
這建立沒有任何錯誤。
我也知道當你在一個協議中聲明一個@property
時,它不會自動合成。
所以如果我想保留@property
聲明在執行中,我將不得不@synthesize
它。這也適用。
所以我的問題是,爲什麼不宣告頭VS實現文件此事的內部@property
如果@property
在協議內最初宣佈?
沒有協議,我認爲唯一的區別是使@property
公共或私人。但很明顯,如果您在頭文件中聲明@property
vs實施文件
由於您公開聲明您的類符合協議(在.h文件中),您還必須公開聲明您擁有該屬性。如果您只希望該屬性是私有的,請遵守類擴展中的協議而不是公共接口。 – rmaddy
我仍然得到這個錯誤:\我也不認爲我可以那樣做,因爲我的其他對象需要知道'MyViewController'符合'MyProtocol'--並且它看起來像沒有人知道它會如果我符合類擴展 –
好的,那麼如果你需要公開聲明協議,那你爲什麼不公開聲明這個協議呢? – rmaddy