Swift: использовать аргументы по умолчанию в лямбде

Я хотел бы использовать значения по умолчанию для аргументов лямбда, таких как:

func lambdaArgumentTest() -> String {
  let lambda = { (optString: String = "") -> String in optString }
  return lambda()
}

Но компилятор, кажется, утверждает, что это невозможно:

Default argument is only permitted for a non-curried function parameter

Есть ли хорошая работа для этого? Будет ли это возможно в будущих версиях?

2 ответа

Я не могу сказать, будет ли это когда-либо возможным в вашей попытке, но похоже, что вы можете обойти эту ошибку, используя вместо этого вложенную функцию.

func lambdaArgumentTest() -> String {
    func lambda(optString: String = "") -> String {
        return optString
    }

    return lambda()
}

Это кажется очень глючным даже в Xcode 6.0.1. Следующий код аварийно завершает работу Playground 100% времени:

func test(_ a: Int = 0) -> Int {
    return 100 + a;
}

let test2 = test

test()   // returns 100
test(21) // returns 121

// test2()  // crashes playground if uncommented

Что касается ошибки, которую вы получаете из своего кода, то со стороны это выглядит как произвольное ограничение. Возможно, это связано с тем, как в Swift реализованы методы, но это только предположение.

Другие вопросы по тегам