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

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)

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]"

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"]

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"]

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.


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])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.