2016-05-18 2 views
4

Это сводит меня с ума.Как преобразовать Int в String.CharacterView.Index

В Swift 2.2 он делает невозможным индекс String с Int. Например:

let myString = "Test string" 
let index = 0 
let firstCharacter = myString[index] 

Это приведет с ошибкой компиляции, говоря

«индекс» недоступен: не подстрочный Строка с Int, обратитесь к документации комментарий для обсуждения

Один обходной путь, который я вижу, состоит в том, чтобы преобразовать целое число в тип индекса, но я не могу понять, как это сделать.

+1

Swift внезапно стало очень сложно использовать с 2.2 ... – nekonari

+2

Возможный дубликат [Получить n-й символ строка в языке программирования Swift] (http://stackoverflow.com/questions/24092884/get-nth-character-of-a-string-in-swift-programming-language) – Moritz

+0

Невозможно было проиндексировать строку с помощью 'Int' в Swift. – Sulthan

ответ

6

Это не то, что подписка невозможна. Ne но, как правило, требуется один дополнительный шаг, чтобы получить те же результаты, что и раньше. Ниже, я сделал то же самое, что и вы, но в Swift 2,2

let myString = "Test string" 
let intForIndex = 0 
let index = myString.startIndex.advancedBy(intForIndex) 
let firstCharacter = myString[index] 

Swift 3.x/4.x:

let myString = "Test string" 
let intForIndex = 0 
let index = myString.index(myString.startIndex, offsetBy: intForIndex) 
let firstCharacter = myString[index] 

EDIT 1:

Обновлен код, поэтому вы можете использовать Int, который был передан в значение «index» в другом месте.

EDIT 2:

В комплекте Swift 3 + 4 Swift синтаксис.

+0

Это трюк, но как насчет преобразования в другую сторону? – nekonari

+0

Что это значит? – ZGski

+0

Взятие типа .Index и превращение его в Int. – nekonari

5

Это раздражает щеколду из меня тоже, так что я написал продолжение борьбы с ним:

extension String { 
    subscript (index: Int) -> Character { 
     let charIndex = self.startIndex.advancedBy(index) 
     return self[charIndex] 
    } 

    subscript (range: Range<Int>) -> String { 
     let startIndex = self.startIndex.advancedBy(range.startIndex) 
     let endIndex = startIndex.advancedBy(range.count) 

     return self[startIndex..<endIndex] 
    } 
} 

// Usage 
let str = "Hello world" 

print(str[0])  // H 
print(str[0..<5]) // Hello 
-1

ZGski ответ обновленного Свифтом 3

let testText = "Test text 123" 
let position = 11 
let index = testText.characters.index(testText.startIndex, offsetBy: position) 
let character = testText[index] // "2" 
0

Примера для быстрых 4:

let myString = "Test string" 
let index = 0 
let firstCharacter = myString[String.Index(encodedOffset: index)] 
Смежные вопросы