2014-11-04 3 views
16

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

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) ->()? 

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

+2

Я открыл билет в репортере с ошибкой Apple. Я думаю, что это ошибка. Компилятор Swift теперь немного глючит. – Shuo

+0

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

+0

Вы правы; это не удается. –

ответ

1

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

0

@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

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

Смежные вопросы