Objective c Swift等同于id<;MyProtocol>;?
问题在标题中。在Objective-C中,如果我想拥有一个属性(如委托),该属性具有以遵守某个协议,则可以这样定义: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或
@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-Cid
的等效项。例如:
// Objective-C
-void myMethodWithSome:(id <MyProtocolName>)param {
// ...
}
// Swift
func myMethodWithSome(param: protocol<MyProtocolName>) {
//...
}
//Objective-C
-void myMethodWithSome:(id)参数{
// ...
}
//迅捷的
func myMethodWithSome(参数:协议){
//...
}
此处:弱变量必须始终为可选类型。有关这方面的详细信息,请参阅我的书:这在Swift 4中被弃用:-(