swift 块内的协议语法
Protocol syntax inside block in swift
我有一个接受块的方法,objective C 中的方法签名是
- (void) startWithFinishingBlock:(FinishingBlock _Nonnull)finishingBlock;
我有如下 typedef FinishingBlock
typedef void (^FinishingBlock)(id<Operation> _Nonnull operation);
现在我正尝试从 swift 调用此方法,但在将其写入 swift 时遇到了一些麻烦。我最终得到了这样的结果。
operation?.start(finishing: ({(operation : AnyObject) in
} as? FinishingBlock)!)
但我知道它不应该是 AnyObject
,我想要一些符合 <Operation>
协议的对象。我如何在 swift.
中定义它
还有一件事,我的代码中有一个操作 class 和一个 <Operation>
协议。所以基本上 Operation
class 符合 <Operation>
协议
当您不确定时,您可以推断出正确的类型,例如:
operation?.start { operation in
// ...
}
为了完整起见,语法(既不使用上述尾随闭包语法也不推断类型)为:
operation?.start(finishing: { (operation: MyApp.Operation) -> Void in
// ...
})
因为你的 Operation
协议与基金会 Operation
类型冲突(即 Swift 3 中 NSOperation
的新名称),你必须限定你的协议名称使用您的目标名称(在我上面的示例中为 MyApp
)。这是推断参数类型的优势,因为您不必处理它。
无论如何,如果有机会,我可能会建议您重命名您的 Operation
协议以避免将来出现任何混淆。
我有一个接受块的方法,objective C 中的方法签名是
- (void) startWithFinishingBlock:(FinishingBlock _Nonnull)finishingBlock;
我有如下 typedef FinishingBlock
typedef void (^FinishingBlock)(id<Operation> _Nonnull operation);
现在我正尝试从 swift 调用此方法,但在将其写入 swift 时遇到了一些麻烦。我最终得到了这样的结果。
operation?.start(finishing: ({(operation : AnyObject) in
} as? FinishingBlock)!)
但我知道它不应该是 AnyObject
,我想要一些符合 <Operation>
协议的对象。我如何在 swift.
还有一件事,我的代码中有一个操作 class 和一个 <Operation>
协议。所以基本上 Operation
class 符合 <Operation>
协议
当您不确定时,您可以推断出正确的类型,例如:
operation?.start { operation in
// ...
}
为了完整起见,语法(既不使用上述尾随闭包语法也不推断类型)为:
operation?.start(finishing: { (operation: MyApp.Operation) -> Void in
// ...
})
因为你的 Operation
协议与基金会 Operation
类型冲突(即 Swift 3 中 NSOperation
的新名称),你必须限定你的协议名称使用您的目标名称(在我上面的示例中为 MyApp
)。这是推断参数类型的优势,因为您不必处理它。
无论如何,如果有机会,我可能会建议您重命名您的 Operation
协议以避免将来出现任何混淆。