Swift 相当于 id<MyProtocol>?

Swift equivalent of id<MyProtocol>?

问题在标题里。在 Objective-C 中,如果我想要一个 属性(像一个委托)HAS 来遵守某个协议,它可以这样定义:

@property (weak) id<MyDelegate> delegate;

如何在 Swift 中执行此操作?

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

weak var delegate : MyDelegate?

但是为了让它工作,MyDelegate 必须是 @objcclass 协议,以保证采用者是 class(不是结构或枚举, 因为它们不能 weak).

像类型一样使用协议,所以:

weak var delegate:MyDelegate?

我认为确切的反义词是:

weak var delegate: protocol<MyDelegate>?

与 swift 语法相比,我更喜欢这种旧的 objc 风格,因为在 swift 中首先是基础 class,然后是所有采用的协议。如果您的协议没有 "Delegate" 后缀,这可能会造成混淆,因为您不知道 DataAdoption(例如)是超级 class 还是协议。

知道 Swift 中方法声明中 Objective-C id<MyProtocolName> 的等价物是 protocol<MyProtocolName> 也很好。例如:

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

// Swift
func myMethodWithSome(param: protocol<MyProtocolName>) {
   //...
}

方法声明更新

Objective-C

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

Swift

func myMethodWithSome(param: MyProtocolName) {
   //...
}