我可以在Objective-C接口中声明'protocol'类型的变量吗?

Ant*_*ong 13 objective-c

我的想法非常类似于在java中声明一个接口类型的变量.

所以,例如,

头文件1:

@protocol Calculator

@end
Run Code Online (Sandbox Code Playgroud)

然后我定义了一个@interface CalculatorImpl实现上述Calculator协议的方法.

在头文件2中:

@interface SomeViewController : UIViewController {


}

@property (weak, nonatomic) IBOutlet UITextField *txtResult;
@property (weak, nonatomic) Calculator* calculator;

@end
Run Code Online (Sandbox Code Playgroud)

但是,xcode会在计算器行标记错误

property with 'weak' attribute must be of object type 
Run Code Online (Sandbox Code Playgroud)

Objective-c是否禁止使用协议?

yuj*_*uji 26

A @protocol不是一种类型,因此您不能将其用作a的类型@property.

您可能想要做的是:

@property (weak, nonatomic) id <Calculator> calculator;
Run Code Online (Sandbox Code Playgroud)

这声明了一个属性,对其类型没有限制,只不过它符合Calculator协议.


Man*_*lio 5

你应该使用

@property (weak, nonatomic) id <Calculator> calculator;
Run Code Online (Sandbox Code Playgroud)

在 Objective-C 中你不能实例化一个协议,你只能遵守它。因此,与其拥有 type 的Calculator对象,不如拥有一个符合Calculator 协议的通用对象。

否则你可以使用

@property (weak, nonatomic) CalculatorImpl* calculator;
Run Code Online (Sandbox Code Playgroud)

因为CalculatorImpl是接口,而不是协议。