2015-12-31 15 views
35

Ich möchte den Index eines Buchstaben in einer Zeichenfolge in einen ganzzahligen Wert konvertieren. Versucht, die Header-Dateien zu lesen, aber ich kann den Typ für Index nicht finden, obwohl es mit Methoden (z. B. distanceTo) Protokoll ForwardIndexType zu entsprechen scheint.Wie konvertiert man "Index" in Swift in "Int"?

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

+0

do u haben Xcode 7.2 und schnelle 2.x? – aaisataev

+0

Eigentlich lade ich gerade Xcode 7.2 herunter. – Christopher

+0

Für eindeutige Zeichen string: 'let index = Zeichenfolge (letters.characters.reverse()). Characters.indexOf (" c ")! DistanceTo (letters.endIndex)' – dfri

Antwort

30

Sie müssen die Methode DistanceTo (Index) in Bezug auf die ursprüngliche Zeichenfolge verwenden, starten Index:

let intValue = letters.startIndex.distanceTo(index) 

Sie können auch String erweitern mit einem Verfahren nach dem ersten Vorkommen eines Zeichens in einem String zurück als folgen:

extension String { 
    func indexDistanceOfFirst(character character: Character) -> Int? { 
     guard let index = characters.indexOf(character) else { return nil } 
     return startIndex.distanceTo(index) 
    } 
} 

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

Xcode 8 • Swift 3

extension String { 
    func indexDistance(of character: Character) -> Int? { 
     guard let index = characters.index(of: character) else { return nil } 
     return distance(from: startIndex, to: index) 
    } 
} 

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

Xcode 9 • Swift 4

extension String { 
    func indexDistance(of character: Character) -> Int? { 
     guard let index = index(of: character) else { return nil } 
     return distance(from: startIndex, to: index) 
    } 
} 

Ein anderer möglicher Ansatz in Swift 4 ist der Index encodedOffset zurückzukehren:

extension String { 
    func encodedOffset(of character: Character) -> Int? { 
     return index(of: character)?.encodedOffset 
    } 
    func encodedOffset(of string: String) -> Int? { 
     return range(of: string)?.lowerBound.encodedOffset 
    } 
} 

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

Ich bin so verwirrt, warum sie nicht nur entscheiden würde, eine Funktion zu machen, die den Integer-Wert-Index eines Array-Elements zurückgibt. . smh – MarksCode

+3

Nicht alle Zeichen können in einem einzigen Byte gespeichert werden. Sie sollten sich etwas Zeit nehmen und die Dokumentation zu Swift String lesen. –

+1

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html –