W języku Swift typem zwracania krojenia Array [String] nie wydaje się być [String]

87

Tnę tablicę ciągów i ustawiam to na [String]zmienną, ale sprawdzanie typów narzeka. Czy to możliwy błąd kompilatora?

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

zrzut ekranu

Liron Shapira
źródło

Odpowiedzi:

169

Indeksowanie tablicy z zakresem nie zwraca tablicy, ale wycinek. Możesz jednak stworzyć tablicę z tego wycinka.

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
Connor
źródło
3
Gdzie znajdujesz Sliceudokumentowane? Również komunikat o błędzie jest niepoprawny, a Slicena placu zabaw pojawia się jako [Ciąg]. Wydaje się więc, że są dwa błędy kompilatora i brakuje dokumentacji.
zaph,
1
Definicję metody subscipt można zobaczyć tutaj: developer.apple.com/library/prerelease/ios/documentation/ ...
Connor
2
Zgadzam się, że błąd jest niepoprawny i dokumentacja może trochę popracować. Jeśli spróbujesz tego w dwóch krokach: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsdaje to bardziej pomocneerror: 'Slice<String>' is not convertible to '[String]'
Connor,
Moja wina, spojrzałem na Swift iBooks. Myślę, że Apple powinno je usunąć, aby były aktualne.
zaph,
1
W języku Swift 3 pojawia się błąd w trzecim wierszu: „Typ„ Ciąg ”nie jest zgodny z protokołem„ indeksowalny ””.
RenniePet
14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
uff
źródło
0

Możesz również to zrobić, aby uzyskać nową tablicę wycinka:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]
Steve Rosenberg
źródło
W porządku, ale to zagmatwane.
DawnSong
Spodziewałem się, że zostanie wydrukowane „jest”
Yitzchak
0

Innym sposobem na to, że w jednym miejscu jest połączyć deklaracja zmiennej let someTags: [String]i map(_:), że przekształci ArraySlice<String>się [String]:

let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
pacyfikacja
źródło
0

Innym wygodnym sposobem konwersji an ArraySlicena Arrayto jest:

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

Nie jest to idealne rozwiązanie, ponieważ inny programista (lub Ty), który przyjrzy mu się później, może nie zrozumieć jego celu. Dobra wiadomość jest taka, że ​​jeśli ten programista (może ty) usunie + []plik, natychmiast napotka błąd kompilatora, który, miejmy nadzieję, wyjaśni jego cel.

jeremyabannister
źródło
0

Po prostu rzuć plasterek jako tablicę, gdy zostanie utworzony. Zachowywanie Array jako tablicy bez konieczności używania zmiennej pośredniej. Działa to świetnie, gdy używasz typów kodowanych.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
StarPlayrX
źródło