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 协议以避免将来出现任何混淆。