ede*_*y05 55 protocols objective-c
ObjectProperties.h
@protocol ObjectProperties <NSObject>
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSDate *date;
@property (assign, nonatomic) int64_t index;
@end
Run Code Online (Sandbox Code Playgroud)
ClassA.h
#import <Foundation/Foundation.h>
@protocol ObjectProperties;
@interface ClassA : NSObject <ObjectProperties>
- (void)specialSauce;
@end;
Run Code Online (Sandbox Code Playgroud)
ManagedClassA.h
#import <CoreData/CoreData.h>
@protocol ObjectProperties;
@interface ManagedClassA : NSManagedObject <ObjectProperties>
- (void)doSomething;
@end;
Run Code Online (Sandbox Code Playgroud)
从上面的代码示例中,我在.h文件中定义了一个协议,用于Core Data对象以及普通的'vanilla对象.似乎"噪音"使符合类#import协议在其标题中; 如上所示,在实现文件中转发声明协议和导入会更清晰.但是,当这样做时,Xcode会发出警告:
Cannot find protocol definition for 'ObjectProperties'
代码编译,主要是工作.我之所以说主要是因为Core Data试图动态创建标量属性的getter/setter有一些愚蠢,但我认为这可能是因为我遇到了边缘情况.
当然,最明显的解决方法是将协议头导入类头.
如果我的理解是正确的(我的知识是最近获得的,所以我完全有可能我错了),如果我将协议导入我的类头并对协议进行更改,那么导入我的所有后续文件必须重新编译类.
解决此类问题的正确方法是什么?
new*_*cct 106
您无法转发声明超类或其符合的协议.在这些情况下,您必须包含标题.这是因为(在超类的情况下)超类的实例变量和方法成为你的类的一部分; 或者(在协议的情况下)协议的方法成为您的类中声明的方法,而无需明确声明它们.(即现在包含你的类标题的其他人会看到你的类声明了这些方法,就像你自己声明它们一样.)唯一可行的方法是它们是否已在此范围内定义,即它们的标题是导入的.
#import <SomeClass.h>
#import <SomeProtocol.h> // these two must be imported
@interface MyClass : SomeClass <SomeProtocol>
@end
Run Code Online (Sandbox Code Playgroud)
前向声明对于仅显示在变量类型中的事物(特别是对象指针变量)非常有用.对象指针的大小都相同,运行时不同类型的对象指针之间没有区别(对象指针类型的概念只是编译时的事情).因此,没有必要确切地知道这些类型的类中的内容.因此,他们可以向前宣布.
@class SomeClass;
@protocol SomeProtocol; // you can forward-declare these
@interface MyClass {
SomeClass *var1;
id<SomeProtocol> var2;
}
@end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30504 次 |
| 最近记录: |