Я разрезаю массив строк и устанавливаю его в качестве [String]
переменной, но средство проверки типов жалуется. Это возможная ошибка компилятора?
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]
Ответы:
Добавление индекса к массиву с диапазоном возвращает не массив, а срез. Однако вы можете создать массив из этого среза.
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
var someTags = tags[1..<3] var someTagsArray: [String] = someTags
это даст вам больше пользыerror: 'Slice<String>' is not convertible to '[String]'
Вы также можете сделать это, чтобы получить новый массив среза:
var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0]) //prints ["is", "cool"]
Другой способ сделать это в одном месте - объединить объявление переменной let someTags: [String]
и map(_:)
преобразовать его ArraySlice<String>
в [String]
:
let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
Еще один удобный способ преобразования ArraySlice
в Array
:
var tags = ["this", "is", "cool"]
var someTags: [String] = tags[1..<3] + []
Он не идеален, потому что другой разработчик (или вы), который рассмотрит его позже, может не понять его цели. Хорошая новость заключается в том, что если этот разработчик (возможно, вы) удалит его, + []
он немедленно столкнется с ошибкой компилятора, которая, мы надеемся, прояснит его цель.
Просто преобразуйте срез в массив при его создании. Сохранение массива в виде массива без использования промежуточной переменной. Это отлично работает при использовании кодируемых типов.
var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
Slice
документальное подтверждение? Также сообщение об ошибке неверно, иSlice
на игровой площадке отображается как [String]. Таким образом, кажется, что есть две ошибки компилятора и отсутствует документация.