Возможно, это проблема бета-версии Xcode 8, однако до версии 2.2 ключевому слову var
разрешено добавлять параметры в сигнатуры функций:
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)
}
Тем не менее, мне интересно узнать, является ли это ожидаемой функциональностью и есть ли способ изменить параметр, переданный в замыкание напрямую?