Ich möchte den Index eines Buchstabens, der in einer Zeichenfolge enthalten ist, in einen ganzzahligen Wert konvertieren. Es wurde versucht, die Header-Dateien zu lesen, aber ich kann den Typ für nicht finden Index
, obwohl er dem Protokoll ForwardIndexType
mit Methoden (z distanceTo
. B. ) zu entsprechen scheint .
var letters = "abcdefg"
let index = letters.characters.indexOf("c")!
// ERROR: Cannot invoke initializer for type 'Int' with an argument list of type '(String.CharacterView.Index)'
let intValue = Int(index) // I want the integer value of the index (e.g. 2)
Jede Hilfe wird geschätzt.
let index = letters.characters.index(of: "c")
nächste Zeilelet int_index = letters.characters.distance(from: letters.startIndex, to: index)
Antworten:
bearbeiten / aktualisieren:
Xcode 11 • Swift 5.1 oder höher
Spielplatztests
quelle
Swift 4
Hinweis: Wenn der String dieselben mehreren Zeichen enthält, wird nur das nächste von links angezeigt
quelle
"🇺🇸🇺🇸🇧🇷".index(of: "🇧🇷")?.encodedOffset // 16
encodedOffset
ist von Swift 4.2 veraltet .Verfallsmeldung:
encodedOffset
wurde veraltet, da die häufigste Verwendung falsch ist. Verwenden Sieutf16Offset(in:)
diese Option , um das gleiche Verhalten zu erzielen.Also können wir so verwenden
utf16Offset(in:)
:quelle
let str = "🇺🇸🇺🇸🇧🇷"
let index = str.firstIndex(of: "🇧🇷")?.utf16Offset(in: str)
// Ergebnis: 8Um eine Zeichenfolgenoperation basierend auf dem Index auszuführen, können Sie dies nicht mit dem herkömmlichen numerischen Indexansatz tun. weil swift.index von der Indexfunktion abgerufen wird und nicht vom Typ Int ist. Obwohl String ein Array von Zeichen ist, können wir Elemente nicht nach Index lesen.
Das ist frustrierend.
Um einen neuen Teilstring für jedes gerade Zeichen einer Zeichenfolge zu erstellen, überprüfen Sie den folgenden Code.
Ausgabe: acegikmoqsuwy
Danke im Voraus
quelle
var counter = 0
let result = mystr.filter { _ in
defer { counter += 1 }
return counter.isMultiple(of: 2)
}
var index = mystr.startIndex
let result = mystr.filter { _ in
defer { mystr.formIndex(after: &index) }
return mystr.distance(from: mystr.startIndex, to: index).isMultiple(of: 2)
}