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.


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")
}

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

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

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


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