Wie konvertiere ich "Index" in Swift in "Int"?

86

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 ForwardIndexTypemit 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.

Christopher
quelle
Hast du Xcode 7.2 und Swift 2.x?
Aaisataev
Eigentlich lade ich gerade Xcode 7.2 herunter.
Christopher
29
Es gibt nichts Frustrierenderes, als den Index zu sehen, den Sie auf einem Spielplatz ins Gesicht starren möchten, und es ist eine gigantische PITA, den Index in die Art umzuwandeln, die Sie benötigen. Ich würde lieber meinen Schwanz in eine Tür schlagen.
Adrian
1
Swift 3: let index = letters.characters.index(of: "c") nächste Zeilelet int_index = letters.characters.distance(from: letters.startIndex, to: index)
Viktor
8
Apple WTF !!!!!!
Borzh

Antworten:

84

bearbeiten / aktualisieren:

Xcode 11 • Swift 5.1 oder höher

extension StringProtocol {
    func distance(of element: Element) -> Int? { firstIndex(of: element)?.distance(in: self) }
    func distance<S: StringProtocol>(of string: S) -> Int? { range(of: string)?.lowerBound.distance(in: self) }
}

extension Collection {
    func distance(to index: Index) -> Int { distance(from: startIndex, to: index) }
}

extension String.Index {
    func distance<S: StringProtocol>(in string: S) -> Int { string.distance(to: self) }
}

Spielplatztests

let letters = "abcdefg"

let char: Character = "c"
if let distance = letters.distance(of: char) {
    print("character \(char) was found at position #\(distance)")   // "character c was found at position #2\n"
} else {
    print("character \(char) was not found")
}

let string = "cde"
if let distance = letters.distance(of: string) {
    print("string \(string) was found at position #\(distance)")   // "string cde was found at position #2\n"
} else {
    print("string \(string) was not found")
}
Leo Dabus
quelle
44
Ich bin so verwirrt, warum sie sich nicht einfach dazu entschließen, eine Funktion zu erstellen, die den Integer-Wert-Index des Elements eines Arrays zurückgibt. Smh
MarksCode
5
Nicht alle Zeichen können in einem einzigen Byte gespeichert werden. Sie sollten sich etwas Zeit nehmen und die Swift String-Dokumentation lesen
Leo Dabus
4
Tbh Ich versuche, den Integer-Wert-Index des Elements eines regulären Arrays zu erhalten, nicht eine Zeichenfolge.
MarksCode
28
Einfache Dinge unnötig kompliziert machen :(
Iulian Onofrei
5

Swift 4

var str = "abcdefg"
let index = str.index(of: "c")?.encodedOffset // Result: 2

Hinweis: Wenn der String dieselben mehreren Zeichen enthält, wird nur das nächste von links angezeigt

var str = "abcdefgc"
let index = str.index(of: "c")?.encodedOffset // Result: 2
Shem Alexis Chavez
quelle
5
Verwenden Sie encodedOffset nicht. encodedOffset ist veraltet: encodedOffset ist veraltet, da die häufigste Verwendung falsch ist. versuchen"🇺🇸🇺🇸🇧🇷".index(of: "🇧🇷")?.encodedOffset // 16
Leo Dabus
@LeoDabus Sie geben korrekt an, dass es veraltet ist. Aber Sie schlagen trotzdem vor, es als Antwort zu verwenden. Die richtige Antwort lautet: index_Of_YourStringVariable.utf16Offset (in: yourStringVariable)
TDesign
UTF16 Offset ist wahrscheinlich nicht das, was Sie wollen
Leo Dabus
1

encodedOffsetist von Swift 4.2 veraltet .

Verfallsmeldung: encodedOffsetwurde veraltet, da die häufigste Verwendung falsch ist. Verwenden Sie utf16Offset(in:)diese Option , um das gleiche Verhalten zu erzielen.

Also können wir so verwenden utf16Offset(in:):

var str = "abcdefgc"
let index = str.index(of: "c")?..utf16Offset(in: str) // Result: 2
Shohin
quelle
1
try let str = "🇺🇸🇺🇸🇧🇷" let index = str.firstIndex(of: "🇧🇷")?.utf16Offset(in: str)// Ergebnis: 8
Leo Dabus
0

Um 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.

let mystr = "abcdefghijklmnopqrstuvwxyz"
let mystrArray = Array(mystr)
let strLength = mystrArray.count
var resultStrArray : [Character] = []
var i = 0
while i < strLength {
    if i % 2 == 0 {
        resultStrArray.append(mystrArray[i])
      }
    i += 1
}
let resultString = String(resultStrArray)
print(resultString)

Ausgabe: acegikmoqsuwy

Danke im Voraus

Shrikant Phadke
quelle
Dies kann leicht mit Filter erreicht werdenvar counter = 0 let result = mystr.filter { _ in defer { counter += 1 } return counter.isMultiple(of: 2) }
Leo Dabus
Wenn Sie den String.index bevorzugenvar index = mystr.startIndex let result = mystr.filter { _ in defer { mystr.formIndex(after: &index) } return mystr.distance(from: mystr.startIndex, to: index).isMultiple(of: 2) }
Leo Dabus