Возможно, это Xcode 8 бета проблема, однако, до версии 2.2 var
ключевое слово разрешено предварять параметры сигнатуры функций:Как обозначить изменяемые параметры в замыканиях с Swift> 2.2?
func (var stringName: String) { ... }
Это с тех пор является устаревшим, вместо там быть мало пользы над inout
func (stringName: inout String) { ... }
Я попытался следующим в map
закрытии, и хотя я не получаю предупреждение устаревания умеренно ожидаемое я должен, ошибка была скорее segmentation fault: 11
let demoString = ["hi", "there", "world"].map { (var word) -> String in
let firstChar = word.remove(at: word.startIndex)
}
Ошибка удаляется, как только я пытаюсь мутировать переменную (предположительно изменяемую) word
.
Я попытался использовать другие варианты, например. используя inout
let demoString = ["hi", "there", "world"].map { (word: inout String) -> String in
let firstChar = word.remove(at: word.startIndex)
}
Но компилятор жалуется, что это ошибочно изменяет подпись закрытия вообще и не будет компилироваться.
Очевидно, что обходной путь просто скопировать переменную к локальной внутри крышки:
let demoString = ["hi", "there", "world"].map { (word) -> String in
let tempWord = word
let firstChar = tempWord.remove(at: tempWord.startIndex)
}
Однако, мне интересно знать, если ожидается, что это функциональность & ли или нет способ мутация параметра, переданного непосредственно в замыкание?
ли ваш вопрос был дан ответ? – Alexander