В Swift возвращаемый тип среза Array [String] не похож на [String]

87

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

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

снимок экрана

Лирон Шапира
источник

Ответы:

169

Добавление индекса к массиву с диапазоном возвращает не массив, а срез. Однако вы можете создать массив из этого среза.

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
Коннор
источник
3
Где вы найдете Sliceдокументальное подтверждение? Также сообщение об ошибке неверно, и Sliceна игровой площадке отображается как [String]. Таким образом, кажется, что есть две ошибки компилятора и отсутствует документация.
zaph
1
Вы можете увидеть определение метода подписки здесь: developer.apple.com/library/prerelease/ios/documentation/…
Коннор,
2
Я согласен с тем, что ошибка неверна, и документация может потребовать некоторой работы. Если вы попробуете сделать это в два этапа: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsэто даст вам больше пользыerror: 'Slice<String>' is not convertible to '[String]'
Коннор
По своей вине я посмотрел на Swift iBooks. Я думаю, Apple следует удалить их, чтобы поддерживать их в актуальном состоянии.
zaph
1
В Swift 3 я получаю сообщение об ошибке в третьей строке: «Тип String не соответствует протоколу indexable».
RenniePet
14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
Zaph
источник
0

Вы также можете сделать это, чтобы получить новый массив среза:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]
Стив Розенберг
источник
Это нормально, но это сбивает с толку.
DawnSong 01
Я ожидал, что он напечатает «есть»
Ицхак
0

Другой способ сделать это в одном месте - объединить объявление переменной let someTags: [String]и map(_:)преобразовать его ArraySlice<String>в [String]:

let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
умиротворение
источник
0

Еще один удобный способ преобразования ArraySliceв Array:

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

Он не идеален, потому что другой разработчик (или вы), который рассмотрит его позже, может не понять его цели. Хорошая новость заключается в том, что если этот разработчик (возможно, вы) удалит его, + []он немедленно столкнется с ошибкой компилятора, которая, мы надеемся, прояснит его цель.

Jeremyabannister
источник
0

Просто преобразуйте срез в массив при его создании. Сохранение массива в виде массива без использования промежуточной переменной. Это отлично работает при использовании кодируемых типов.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
StarPlayrX
источник