Как использовать substringToIndex в Swift? [дубликат]


этот вопрос уже есть ответ здесь:

  • Тип Строки.Индекс 'не соответствует протоколу 'IntegerLiteralConvertible' 3 ответы

Я получаю ошибку компилятора в этой строке:

UIDevice.currentDevice().identifierForVendor.UUIDString.substringToIndex(8)

Тип '.Индекс 'не соответствует протоколу 'IntegerLiteralConvertible'

мое намерение состоит в том, чтобы получить подстроку, но как?

1 65

1 ответ:

В Swift, String индексация уважает кластеры графем, и IndexType - это не Int. У вас есть два варианта - привести строку (ваш UUID) к NSString и использовать ее как "раньше" или создать индекс для n-го символа.

как показано ниже :

однако метод радикально изменился между версиями Swift. Читать для более поздних версий...

Swift 1

let s: String = "Stack Overflow"
let ss1: String = (s as NSString).substringToIndex(5) // "Stack"
//let ss2: String = s.substringToIndex(5)// 5 is not a String.Index
let index: String.Index = advance(s.startIndex, 5)
let ss2:String = s.substringToIndex(index) // "Stack"

CMD-Click на substringToIndex смущенно ведет вас к NSString определение, однако CMD-нажмите на String и вы найдете следующее:

extension String : Collection {
    struct Index : BidirectionalIndex, Reflectable {
        func successor() -> String.Index
        func predecessor() -> String.Index
        func getMirror() -> Mirror
    }
    var startIndex: String.Index { get }
    var endIndex: String.Index { get }
    subscript (i: String.Index) -> Character { get }
    func generate() -> IndexingGenerator<String>
}

Swift 2
Как отмечает комментатор @DanielGalasko advance теперь ситуация изменилась...

let s: String = "Stack Overflow"
let ss1: String = (s as NSString).substringToIndex(5) // "Stack"
//let ss2: String = s.substringToIndex(5)// 5 is not a String.Index
let index: String.Index = s.startIndex.advancedBy(5) // Swift 2
let ss2:String = s.substringToIndex(index) // "Stack"

Swift 3
В Swift 3 он снова изменился:

let s: String = "Stack Overflow"
let ss1: String = (s as NSString).substring(to: 5) // "Stack"
let index: String.Index = s.index(s.startIndex, offsetBy: 5)
var ss2: String = s.substring(to: index) // "Stack"

Swift 4
В Swift 4, Еще одно изменение:

let s: String = "Stack Overflow"
let ss1: String = (s as NSString).substring(to: 5) // "Stack"
let index: String.Index = s.index(s.startIndex, offsetBy: 5)
var ss3: Substring = s[...index] // "Stack"
var ss4: String = String(s[...index]) // "Stack"