【问题标题】:"Expected a Type" error for protocol which should be known to the compiler编译器应该知道的协议的“预期类型”错误
【发布时间】:2013-11-18 17:21:46
【问题描述】:

最小示例“Test.h”:

#import <Foundation/Foundation.h>

@protocol CallBack <NSObject>

-(void)method;

@end

@interface Test : NSObject

-(void)callback:(CallBack*)theCallback;

@end

以及对应的“Test.m”:

#import "Test.h"

@implementation Test

-(void)callback:(CallBack*)theCallback
{
    [theCallback method];
}
@end

这将为 .m 和 .h 文件中的 CallBack 参数提供“预期类型”错误。由于 CallBack 协议是在其他所有内容之前定义的,我不明白为什么编译器找不到它。如果我添加一个 Forward-Definition @class CallBack;在头文件的开头,它会给我一个“接收器类型'CallBack'例如消息是前向声明”行[theCallback方法]的错误。

为什么编译器找不到协议?

【问题讨论】:

    标签: objective-c cocoa forward-declaration


    【解决方案1】:

    引用符合CallBack 协议的对象的正确语法是id&lt;CallBack&gt;

    因此,您可能想要:

    @protocol CallBack <NSObject>
    
    -(void)method;
    
    @end
    
    @interface Test : NSObject
    
    -(void)callback:(id <CallBack>)theCallback;
    
    @end
    

    @implementation Test
    
    -(void)callback:(id <CallBack>)theCallback
    {
        [theCallback method];
    }
    @end
    

    有关详细信息,请参阅Objective-C 编程指南中的Working with Protocols

    【讨论】:

    • 好答案。稍微扩展一下:id&lt;CallBack&gt; 表示“任何符合 CallBack 协议的对象。您还可以(与其他一些 OO 语言不同)在类型声明中指定类继承和协议一致性:NSArray &lt;CallBack&gt; * 表示“其类是(或继承自)NSArray 且也实现了CallBack 协议的任何对象”。
    • 为什么我使用 id 时不需要 *?它仍然是一个指针,不是吗?
    • @user3005567 id 根据定义是指向对象的通用指针,因此 * 将是多余的。请参阅本文档中对id 的讨论:developer.apple.com/library/ios/documentation/cocoa/conceptual/…。顺便说一句,您总是在 init 方法中看到这一点,这些方法通常被定义为 - (id) init;(即返回指向对象的指针的方法)与显式返回指向字符串的指针的 -(NSString *) someString;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多