swift中块内的协议语法

时间:2016-09-27 21:06:55

标签: objective-c swift protocols objective-c-blocks

我有一个接受块的方法,目标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>协议

1 个答案:

答案 0 :(得分:1)

每当您不确定时,您只能推断出正确的类型,例如:

operation?.start { operation in
    // ...
}

为了完整起见,语法(既不采用上述尾随闭包语法也不推断类型)将是:

operation?.start(finishing: { (operation: MyApp.Operation) -> Void in
    // ...
})

由于您的Operation协议与基础Operation类型(即Swift 3中NSOperation的新名称)发生冲突,因此您必须使用目标名称限定协议名称({ {1}}在上面的例子中)。这是推断参数类型的优势,因为您不必处理这个问题。

无论如何,如果您有机会,我可能会建议您重命名MyApp协议以避免将来出现任何混淆。