Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c swift中块内的协议语法_Objective C_Swift_Protocols_Objective C Blocks - Fatal编程技术网

Objective c swift中块内的协议语法

Objective c swift中块内的协议语法,objective-c,swift,protocols,objective-c-blocks,Objective C,Swift,Protocols,Objective C Blocks,我有一个接受块的方法,目标C中的方法签名是 - (void) startWithFinishingBlock:(FinishingBlock _Nonnull)finishingBlock; 我有下面的typedef FinishingBlock typedef void (^FinishingBlock)(id<Operation> _Nonnull operation); 但是我知道它不应该是任何对象,我想在这里找到一个符合协议的对象。我如何在swift中定义这一点 另外一件

我有一个接受块的方法,目标C中的方法签名是

- (void) startWithFinishingBlock:(FinishingBlock _Nonnull)finishingBlock;
我有下面的typedef FinishingBlock

typedef void (^FinishingBlock)(id<Operation> _Nonnull operation);
但是我知道它不应该是
任何对象
,我想在这里找到一个符合
协议的对象。我如何在swift中定义这一点


另外一件事是,我的代码中有一个操作类和一个
协议。因此,基本上
操作
类符合
协议

当您不确定时,您可以推断正确的类型,例如:

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

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

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

因为您的<代码>操作< /代码>协议与基础<代码>操作< /C> >类型(即,在SWIFT 3中的<代码> NScase< /代码>的新名称)中,您必须用您的目标名称(在上面的示例中<代码> MyApp)限定您的协议名称。这是推断参数类型的优点,因为您不必处理这个问题

无论如何,如果您有机会,我建议您重命名
操作
协议,以避免将来出现任何混乱

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