Inout в закрытии приводит к сбою компилятора Swift

Все, что мне нужно сделать, это запустить новый проект в Swift и добавить к main.swift

struct Foo {
  let bar: (inout baz: String) -> ()
}

Когда я пытаюсь построить, я получаю сообщение об ошибке:
Command failed due to signal: Segmentation fault: 11

Я делаю что-то неправильно?

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

let baz: (inout baz: String) -> () = { baz in
  baz += "x"
  return
}

или даже

var baz: (inout baz: String) -> ()?

он компилируется и работает нормально

Ответы

Ответ 1

Просто протестировал его в Swift 1.2, поставляемом с бета-версией Xcode 6.3, и он скомпилирован успешно. Так что это определенно ошибка в компиляторе, которую они решили в последней версии

Ответ 2

@Bartek Chlebek. В коде, который вы опубликовали, есть одна двусмысленная вещь (выделена жирным шрифтом): "let bar: (inout baz: String) → ()". Когда вы определяете свою функцию, вы сообщаете компилятору, что вы собираетесь возвращать пустой кортеж. Похоже, что более ранние версии компилятора не различали (должно быть ошибкой в ​​двигателе ввода inferring) типа Void и "пустого типа кортежа" (который обозначается как "()). Вот пара слов о синтаксисе кортежей: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html#//apple_ref/doc/uid/TP40014097-CH31-ID448

Возможное решение: явно указать тип возвращаемого значения (в вашем случае это "Пустота" ). Надеюсь, это поможет.