В Swift тип возвращаемого значения Array [String] не выглядит как [String]
5 ответов
Подстановка массива с диапазоном возвращает не массив, а срез. Вы можете создать массив из этого среза, хотя.
var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [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"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0]) //prints ["is", "cool"]
Просто преобразуйте срез в массив при его создании. Сохранение массива в виде массива без использования промежуточной переменной. Это отлично работает при использовании кодируемых типов.
var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])