【问题标题】:Compile error for passing nil to an optional parameter with a generic type constraint将 nil 传递给具有泛型类型约束的可选参数的编译错误
【发布时间】: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)

MQBlockOperationSignUpOperation 都继承自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 编译器的一个错误。它可以在操场项目中重现——定义一个带有约束&lt;T: NSOperation&gt; 和两个参数的函数,一个是T 类型,另一个是接受T 的可选闭包。向 Apple 报告。
  • 我只能怀疑参数configuration 中的类型参数T 存在问题 - 当参数为nil 时。您应该创建一个小样本来演示此问题。 -- 是的,猜测是编译器的问题。

标签: ios swift generics swift2


【解决方案1】:

在 cmets 中,这似乎是 Swift 编译器的一个错误。目前,我喜欢的一个快速、干净的解决方法是在函数签名中提供 nil 作为默认值。

public func append<T: MQOperation>(operation: T,
    validator: (Any? -> Bool)?,
    configurator: ((T, Any?) -> Void)? = nil)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多