In Swift scheint der Slicing-Rückgabetyp Array [String] nicht [String] zu sein.

87

Ich schneide ein Array von Zeichenfolgen auf und setze dies auf eine [String]Variable, aber die Typprüfung beschwert sich. Ist es ein möglicher Compiler-Fehler?

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

Bildschirmfoto

Liron Shapira
quelle

Antworten:

169

Das Abonnieren eines Arrays mit einem Bereich gibt kein Array zurück, sondern ein Slice. Sie können jedoch ein Array aus diesem Slice erstellen.

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)
Connor
quelle
3
Wo finden Sie Slicedokumentiert? Auch die Fehlermeldung ist falsch und wird Sliceauf dem Spielplatz als [String] angezeigt. Es scheint also zwei Compilerfehler und fehlende Dokumentation zu geben.
Zaph
1
Sie können die Definition der Subscipt-Methode hier sehen: developer.apple.com/library/prerelease/ios/documentation/…
Connor
2
Ich bin damit einverstanden, dass der Fehler falsch ist und die Dokumentation einige Arbeit gebrauchen könnte. Wenn Sie es in zwei Schritten versuchen: var someTags = tags[1..<3] var someTagsArray: [String] = someTagses gibt Ihnen die hilfreichereerror: 'Slice<String>' is not convertible to '[String]'
Connor
Meine Schuld, ich habe mir die Swift iBooks angesehen. Ich denke, Apple sollte sie entfernen, um sie auf dem neuesten Stand zu halten.
Zaph
1
Bei Swift 3 wird in der dritten Zeile die Fehlermeldung "Typ 'String' entspricht nicht dem Protokoll 'indexierbar'" angezeigt.
RenniePet
14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"
zaph
quelle
0

Sie können dies auch tun, um ein neues Array des Slice zu erhalten:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]
Steve Rosenberg
quelle
Es ist in Ordnung, aber es ist verwirrend.
DawnSong
Ich habe erwartet, dass es "is" druckt
Yitzchak
0

Eine andere Möglichkeit, dies an einem Ort zu tun, besteht darin, die Variablendeklaration zu kombinieren let someTags: [String]und dies zu map(_:)transformieren ArraySlice<String>in [String]:

let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
Befriedung
quelle
0

Eine weitere bequeme Möglichkeit, ein ArraySlicezu konvertieren , Arrayist folgende:

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

Es ist nicht perfekt, weil ein anderer Entwickler (oder Sie selbst), der es später betrachtet, seinen Zweck möglicherweise nicht versteht. Die gute Nachricht ist, dass wenn dieser Entwickler (vielleicht Sie) das entfernt + [], sofort ein Compilerfehler auftritt, der hoffentlich seinen Zweck klarstellt.

jeremyabannister
quelle
0

Wirf das Slice einfach als Array um, wenn es erstellt wird. Behalten Sie Ihr Array als Array bei, ohne eine Zwischenvariable verwenden zu müssen. Dies funktioniert hervorragend, wenn codierbare Typen verwendet werden.

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
StarPlayrX
quelle