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