2015-12-31 6 views
35

文字列に含まれる文字のインデックスを整数値に変換したい。ヘッダファイルを読み込もうとしましたが、Indexの型を見つけることができませんが、方法はForwardIndexType(例:distanceTo)のプロトコルに準拠しています。Swiftで "Index"を "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) 

何か助けていただければ幸いです。

+0

をuがXcodeの7.2と迅速2.xのがありますか? – aaisataev

+0

実際、この時点でXcode 7.2をダウンロードしています。 。ユニークな文字列の場合 – Christopher

+0

: 'てみましょうインデックス=文字列(letters.characters.reverse())characters.indexOf(「C」)!distanceTo(letters.endIndex)' – dfri

答えて

30

あなたは元の文字列がインデックスを開始するに関連して方法distanceTo(インデックス)を使用する必要があります。

let intValue = letters.startIndex.distanceTo(index) 

あなたはまた、として文字列内の文字の最初の発生を返すようにする方法で文字列を拡張することができます従い

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•スウィフト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•スウィフト4

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

スウィフト4におけるもう一つの可能​​なアプローチは、インデックスencodedOffset返すことです:

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

が、私はとても混乱しているhttps://github.com/frogcjn/OffsetIndexableCollection-String-Int-Indexable-を参照してください。 。smh – MarksCode

+3

すべての文字を1バイトに格納できるわけではありません。あなたは、いくつかの時間がかかると私は、整数値のインデックスを取得しようとしている –

+1

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