Objective c Swift等同于id<;MyProtocol>;?

Objective c Swift等同于id<;MyProtocol>;?,objective-c,swift,delegates,protocols,Objective C,Swift,Delegates,Protocols,问题在标题中。在Objective-C中,如果我想拥有一个属性(如委托),该属性具有以遵守某个协议,则可以这样定义: @property (weak) id<MyDelegate> delegate; @属性(弱)id委托; 如何在Swift中执行此操作?协议是一种类型,因此您可以将其用作声明的变量类型。要使用弱,必须将该类型包装为可选类型。所以你会说: weak var delegate : MyDelegate? 但是为了使其工作,MyDelegate必须是一个@objc或

问题在标题中。在Objective-C中,如果我想拥有一个属性(如委托),该属性具有以遵守某个协议,则可以这样定义:

@property (weak) id<MyDelegate> delegate;
@属性(弱)id委托;

如何在Swift中执行此操作?

协议是一种类型,因此您可以将其用作声明的变量类型。要使用
,必须将该类型包装为可选类型。所以你会说:

weak var delegate : MyDelegate?

但是为了使其工作,MyDelegate必须是一个
@objc
协议,以保证采用者是一个类(不是一个结构或枚举,因为它们不能是
弱的
)。

像类型一样使用协议,因此:

weak var delegate:MyDelegate?

我认为确切的地点是:

weak var delegate: protocol<MyDelegate>?
弱var委托:协议?

与swift语法相比,我更喜欢这种旧的objc样式,因为在swift中,首先是基类,然后是所有采用的协议。如果您的协议没有“委托”后缀,这可能会造成混淆,因为您不知道数据采用(例如)是超类还是协议。

最好知道Swift is
协议中方法声明中Objective-C
id
的等效项。例如:

// Objective-C
-void myMethodWithSome:(id <MyProtocolName>)param {
   // ...
}

// Swift
func myMethodWithSome(param: protocol<MyProtocolName>) {
   //...
}
//Objective-C
-void myMethodWithSome:(id)参数{
// ...
}
//迅捷的
func myMethodWithSome(参数:协议){
//...
}

此处:弱变量必须始终为可选类型。有关这方面的详细信息,请参阅我的书:这在Swift 4中被弃用:-(