我的班级MQChainedOperation
有一个函数append
,它接受任何继承自MQOperation
的操作:
public func append<T: MQOperation>(operation: T,
validator: (Any? -> Bool)?,
configurator: ((T, Any?) -> Void)?) {
// ...
}
在视图控制器中,我这样做:
let chain = MQChainedOperation()
chain.append(
MQBlockOperation {[unowned self] in
// ...
},
validator: nil,
configurator: nil)
chain.append(
SignUpOperation(),
validator: nil,
configurator: nil)
当MQBlockOperation
和SignUpOperation
都从MQOperation
继承时,编译器会在两次调用追加时向我抛出此错误:
无法使用类型'的参数列表调用'append'(MQOperation,验证器:(任何? - &gt; Bool)?,配置器:((MQOperation,Any?) - &gt; Void)?)'
预期类型的参数列表'(T,验证器:(任何? - &gt; Bool)?,配置器:((T,Any?) - &gt; Void)?)'
但是,如果我为configurator
提供一个空的闭包,它可以工作:
chain.append(
MQBlockOperation {[unowned self] in
// ...
return NSDate()
},
validator: nil,
configurator: {(op, result) in})
chain.append(
SignUpOperation(),
validator: nil,
configurator: {(op, result) in})
我应该能够将nil
传递给可选参数,并且解决方法会使我的代码变得丑陋。我该如何解决这个问题?
答案 0 :(得分:1)
在评论中,这似乎是Swift编译器的一个错误。现在,我喜欢的一个快速,干净的修复方法是在函数签名中提供nil
作为默认值。
public func append<T: MQOperation>(operation: T,
validator: (Any? -> Bool)?,
configurator: ((T, Any?) -> Void)? = nil)