Swift 相当于 id<MyProtocol>?
Swift equivalent of id<MyProtocol>?
问题在标题里。在 Objective-C 中,如果我想要一个 属性(像一个委托)HAS 来遵守某个协议,它可以这样定义:
@property (weak) id<MyDelegate> delegate;
如何在 Swift 中执行此操作?
协议是一种类型,因此您可以将其用作已声明的变量类型。要使用 weak
,您必须将类型包装为 Optional。所以你会说:
weak var delegate : MyDelegate?
但是为了让它工作,MyDelegate 必须是 @objc
或 class
协议,以保证采用者是 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) {
//...
}
问题在标题里。在 Objective-C 中,如果我想要一个 属性(像一个委托)HAS 来遵守某个协议,它可以这样定义:
@property (weak) id<MyDelegate> delegate;
如何在 Swift 中执行此操作?
协议是一种类型,因此您可以将其用作已声明的变量类型。要使用 weak
,您必须将类型包装为 Optional。所以你会说:
weak var delegate : MyDelegate?
但是为了让它工作,MyDelegate 必须是 @objc
或 class
协议,以保证采用者是 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) {
//...
}