我有一个接受块的方法,目标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中定义它。
我的代码中还有一个Operation类和一个<Operation>
协议。所以基本上Operation
类符合<Operation>
协议
答案 0 :(得分:1)
每当您不确定时,您只能推断出正确的类型,例如:
operation?.start { operation in
// ...
}
为了完整起见,语法(既不采用上述尾随闭包语法也不推断类型)将是:
operation?.start(finishing: { (operation: MyApp.Operation) -> Void in
// ...
})
由于您的Operation
协议与基础Operation
类型(即Swift 3中NSOperation
的新名称)发生冲突,因此您必须使用目标名称限定协议名称({ {1}}在上面的例子中)。这是推断参数类型的优势,因为您不必处理这个问题。
无论如何,如果您有机会,我可能会建议您重命名MyApp
协议以避免将来出现任何混淆。