【发布时间】:2023-03-13 14:12:01
【问题描述】:
我的班级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 时,编译器会在两次调用追加时向我抛出此错误:
无法使用类型为“(MQOperation,验证器:(Any?-> Bool)?,配置器:((MQOperation,Any?)-> Void)?)”的参数列表调用“附加”
需要一个类型为 '(T, validator: (Any? -> Bool)?, configurator: ((T, Any?) -> 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 传递给可选参数,而解决方法使我的代码很难看。我该如何解决这个问题?
【问题讨论】:
-
您确定在泛型函数
append中对参数configurator的类型注释与应有的完全一致? -
@CouchDeveloper 是的,
configurator应该是一个可选闭包,它接受(T, Any?)类型的元组并且不返回任何内容。我戴着眼镜,但我尽可能地仔细检查了 func 签名的右括号,Xcode 没有抱怨那里有任何语法错误。 -
嗯,看起来不错 - 仔细观察 ;)
-
看起来像 Swift 编译器的一个错误。它可以在操场项目中重现——定义一个带有约束
<T: NSOperation>和两个参数的函数,一个是T类型,另一个是接受T的可选闭包。向 Apple 报告。 -
我只能怀疑参数
configuration中的类型参数T存在问题 - 当参数为nil时。您应该创建一个小样本来演示此问题。 -- 是的,猜测是编译器的问题。