协议构造错误目标C.

时间:2016-05-06 06:10:03

标签: ios objective-c protocols

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**

原因和解决方法是什么?

2 个答案:

答案 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