如何使用默认值使闭包可选



我有很多函数,如果没有提供默认闭包,我希望能够指定一个默认闭包。如果没有一些难看的代码,我似乎不知道该怎么做。

例如,我希望perform函数接受一个名为closure的可选参数,该参数在提供时执行。否则默认执行myClosure。我该如何做得更好,这样我就不必重复函数调用了?

class MyClas {
    typealias closureType = ((number: Int) -> Int)?
    func myClosure (number: Int) -> Int {
        return number * 2
    }
    func perform(number: Int, closure: closureType = nil) -> Int {
        if closure == nil {
            return myClosure(number)
        } else {
            return closure!(number: number)
        }
    }
}

理想情况下,我可以做到这一点!

class MyClass {
    typealias closureType = ((number: Int) -> Int)?
    func myClosure (number: Int) -> Int {
        return number * 2
    }
    func perform(number: Int, closure: closureType = myClosure) -> Int {
        return closure(number: number)
    }
}

您的问题是,您已经将myClosure作为一个方法(或成员函数),这意味着它没有您想要的签名(而是一个类型为MyClass->Int->Int的curried函数)。

要么将其从类中取出,要么使其成为静态(或者在类的情况下更确切地说是"类")方法:

class MyClass {
    typealias closureType = (number: Int) -> Int
    class func myClosure (number: Int) -> Int {
        return number * 2
    }
    func perform(number: Int, closure: closureType = MyClass.myClosure) -> Int {
        return closure(number: number)
    }
}

附言:一旦你这样做了,它就不需要再是可选的了

只是为了展示它作为一种非静态方法进行编译:

class MyClass {
    typealias closureType = MyClass -> (number: Int) -> Int
    func myClosure (number: Int) -> Int {
        return number * 2
    }
    func perform(number: Int, closure: closureType = myClosure) -> Int {
        return closure(self)(number: number)
    }
}
let c = MyClass()
println(c.perform(5))  // prints 10

Closure是Swift的一等公民。所以你可以为它提供默认值。

class MyClass {
    func perform(number: Int, closure: Int -> Int = { $0 * 2 }) -> Int {
        return closure(number)
    }
}

最新更新