Подтвердить что ты не робот

В Swift массив возвращаемого типа массива [String] не выглядит как [String]

Я нарезаю массив строк и устанавливаю его в переменную [String], но проверяет тип проверки. Это возможная ошибка компилятора?

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]

screenshot

4b9b3361

Ответ 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])