2015-12-31 16 views
35

Dizgideki harflerin indeksini tamsayı değerine çevirmek istiyorum. Başlık dosyalarını okumaya teşebbüs edildi ancak Index türünü bulamıyorum, ancak yöntem ForwardIndexType protokolüne uygun görünüyor (ör. distanceTo).Swift'de "Int" yazıp "Index" nasıl dönüştürülür?

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) 

Herhangi bir yardım için teşekkür ederiz.

let intValue = letters.startIndex.distanceTo(index) 

Ayrıca bir dize olarak bir karakterin ilk geçtiği dönmek için bir yöntem ile Dize uzatabilirsiniz:

+0

u xcode 7.2 ve hızlı 2.x var mı? – aaisataev

+0

Aslında şu anda Xcode 7.2'yi indiriyorum. – Christopher

+0

Benzersiz karakterler dizesi için: 'dizin dizini = Dize (letters.characters.reverse()). Characters.indexOf (" c ") !. distanceTo (letters.endIndex)' – dfri

cevap

30

Dizin başlatmak orijinal dizeye ilişkin yöntem DistanceTo (endeks) kullanmak gerekir izleyin:

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

Swift 4'te Başka bir olası yaklaşım indeksi encodedOffset döndürmektir:

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

Neden bir dizinin elemanının tamsayı-değer indeksini döndüren bir işlev yapmaya karar vermeyecekleri konusunda kafam çok karışıktır. smh – MarksCode

+3

Tüm karakterler tek bir baytta saklanamaz. Biraz zaman ayırın ve Swift String belgelerini okuyun –

+1

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

İlgili konular