将nil传递给具有泛型类型约束

时间:2016-02-04 09:20:46

标签: ios swift generics swift2

我的班级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继承时,编译器会在两次调用追加时向我抛出此错误:

  

无法使用类型'的参数列表调用'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传递给可选参数,并且解决方法会使我的代码变得丑陋。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

在评论中,这似乎是Swift编译器的一个错误。现在,我喜欢的一个快速,干净的修复方法是在函数签名中提供nil作为默认值。

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