gpt4 book ai didi

objective-c - 为什么我必须在 header 中声明协议(protocol)指定的属性,而不是类扩展(实现)

转载 作者:太空狗 更新时间:2023-10-30 03:52:28 26 4
gpt4 key购买 nike

所以我有一个协议(protocol),它需要声明一个属性:

@protocol MyProtocol <NSObject>
@property MyView *myView;
@end

以及符合它的对象:

@interface MyViewController : NSViewController <MyProtocol>
@end

但是,如果我在实现文件(类扩展)中声明属性(在协议(protocol)中指定):

@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

第一个答案没有解释任何事情

第二个答案说你实际上可以通过在 header 内声明属性来避免这个错误;唉

标题

@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end

实现

@interface MyViewController()
@end

此构建没有错误。

我还知道,当您在协议(protocol)中声明一个 @property 时,它不会自动合成。

因此,如果我想在实现中保留 @property 声明,我将不得不 @synthesize 它。这也有效。


所以我的问题是,如果 @property 最初是在协议(protocol)内部声明的,为什么在 header 内部声明 @property 与实现文件很重要?

如果没有协议(protocol),我认为唯一的区别是将 @property 设为公开或私有(private)。但很明显,如果您在 header 与实现文件中声明一个 @property

,就会发生/不会发生其他事情

最佳答案

不要在类(class)的任何地方声明那里的属性(property)。它已经在协议(protocol)中声明。

不要将 @property MyView *myView; 放在 MyViewController.m 或 MyViewController.h 文件中。

要修复关于“auto property synthesis”的警告,您只需添加:

@synthesize myView = _myView;

MyViewController 实现或根据需要添加显式 getter 和 setter 方法。

关于objective-c - 为什么我必须在 header 中声明协议(protocol)指定的属性,而不是类扩展(实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32826013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com