在 DataProvider.h
中@protocol NewDataProviderProtocol
- (void)fetchNewData;
@end
在 SomeClass
中#import DataProvider.h
@interface SomeClass :NSObject <NewDataProviderProtocol>
@end
当我尝试使SomeClass符合 NewDataProviderProtocol 时,它说,
No type or protocol named 'NewDataProviderProtocol'
这很奇怪,因为我已经导入了声明协议的头DataProvider.h。
所以我在 SomeClass 的界面之前声明 NewDataProviderProtocol ,但是xcode警告
Cannot find definition for **NewDataProviderProtocol**
原因和解决方法是什么?
答案 0 :(得分:1)
一个。原因
可能你有一个包含循环,因为你也将SomeClass.h导入到DataProvider.h中。这会导致未声明的标识符。
为什么会那样?我们举个例子:
// Foo.h
#import "Bar.h"
@interface Foo : NSObject
…// Do something with Bar
@end
// Bar.h
#import "Foo.h"
@interface Bar : NSObject
…// Do something with Foo
@end
如果你编译,让我们说Foo.h,预编译器将扩展它:
他得到......:
// Foo.h
#import "Bar.h"
@interface Foo : NSObject
…// Do something with Bar
@end
...导入Bar.h(并删除评论......但让我们关注主题。)...
// Foo.h
// Bar.h
#import "Foo.h"
@interface Bar : NSObject
…// Do something with Foo
@end
@interface Foo : NSObject
…// Do something with Bar
@end
Foo.h不会再次导入,因为它已经导入了。最后:
// Bar.h
@interface Bar : NSObject
…// Do something with Foo
@end
@interface Foo : NSObject
…// Do something with Bar
@end
这很清楚:如果A依赖于B而B依赖于A,则串行数据流作为文件不可能同时在A之前的A和B之前。 (档案不是相对论的主题。)
B中。溶液
在大多数情况下,您应该为代码提供层次结构。 (出于很多原因。没有进口问题是最不重要的问题之一。)I。e。在你的代码中,将SomeClass.h导入DataProvider.h看起来很奇怪。
出现这样的问题是代码味道。尝试隔离并修复原因。不要将代码片移动到不同的位置以找到适合它的步伐。这是代码抽奖。
℃。结构
通常你有一个类,希望其他人符合协议。我们举个例子:
// We declare the protocol here, because the class below expects from other classes to conform to the protocol.
@protocol DataSoure
…
@end
@interface Aggregator : NSObject
- (void)addDataSource:(id<DataSource>)dataSource
// We are using a protocol, because we do not want to restrict data sources to be subclass of a specific class.
// Therefore in this .h there cannot be an import of that – likely unknown - class
@end
SomeClass,符合协议
#import "Aggregator.h"
@interface SomeClass:NSObject<DataSource>
…
@end
答案 1 :(得分:0)
要改变两件事:
更改定义如下:
@protocol NewDataProviderProtocol <NSObject>
- (void)fetchNewData;
@end
为什么呢? Why tack a protocol of NSObject to a protocol implementation
仅在DataProvider
中导入SomeClass.m
。您始终可以在实现文件中创建SomeClass
扩展,您可以在其中绑定协议以符合特定类。
@interface SomeClass ()<NewDataProviderProtocol>
@end
为什么呢?这是最好的做法。并克服前瞻性声明错误。例如。 Objective-C: Forward Class Declaration