2016-08-07 23 views
0

Ich habe einen Fall wie folgt aus:String.endIndex Inkrementieren Fehler

var fieldName = "VERSION" 
var versionField = "VERSION:4.1" 

var version = versionField.substringFromIndex(fieldName.endIndex.successor()) 

Die letzte Zeile erzeugen einen Laufzeitfehler „fatalen Fehler: kann endIndex nicht erhöhen“. Es passiert, weil swift nicht weiß, was der nächste Index nach dem größten ist. Sieht so aus, als ob diese Lösung nur für swift 1. * funktioniert. Aber gibt es eine Möglichkeit, dieses Problem für die neue schnelle Version kurz und bündig zu lösen?
Danke für die Antworten.

Antwort

4

Es gibt zwei Probleme:

  • fieldName.endIndex ist das „eine über das Ende“ Position der Zeichenfolge, es keinen Nachfolger hat.
  • Sie dürfen den Index einer Zeichenfolge nicht als Index für eine andere Zeichenfolge verwenden. Das kann in einigen Fällen funktionieren, aber kann mit einer Laufzeitausnahme abstürzen, wenn die Zeichenfolgen Zeichen außerhalb der "grundlegenden mehrsprachigen Ebene" enthalten (Emojis, Flags, ...).

Eine Arbeits Variante wäre (Swift 2.2):

let fieldName = "VERSION:" 
let versionField = "VERSION:4.1" 

if versionField.hasPrefix(fieldName) { 
    let version = versionField.substringFromIndex(
     versionField.startIndex.advancedBy(fieldName.characters.count)) 
    print(version) // 4.1 
} else { 
    print("No version found") 
} 

oder alternativ:

if let range = versionField.rangeOfString(fieldName) 
    where range.startIndex == versionField.startIndex { 
    let version = versionField.substringFromIndex(range.endIndex) 
    print(version) // 4.1 
} else { 
    print("No version found") 
} 

Sie die Einschränkung entfernen

where range.startIndex == versionField.startIndex 

wenn das Feld sollte irgendwo gefunden werden e in der Zeichenfolge.

Swift 3:

if versionField.hasPrefix(fieldName) { 
    let version = versionField.substring(
     from: versionField.index(versionField.startIndex, offsetBy: fieldName.characters.count)) 
    print(version) // 4.1 
} else { 
    print("No version found") 
} 

oder alternativ

if let range = versionField.range(of: fieldName), 
    range.lowerBound == versionField.startIndex { 
    let version = versionField.substring(from: range.upperBound) 
    print(version) // 4.1 
} else { 
    print("No version found") 
} 
+0

Beachten Sie, dass OP hat '" fieldname = "VERSION" 'nicht' fieldname = "VERSION:" 'also denke ich, es sollte 'let version = versionFieldsubstringFromIndex (range.endIndex.advancedBy (1))' right? – Moritz

+1

@EricAya: Ich habe das geändert, um den Code zu vereinfachen. 'range.endIndex.advancedBy (1)' könnte hinter dem sein Ende von 'versionField', also müssten Sie das zuerst überprüfen Ich werde nicht überprüfen, dass auf das Versionsfeld ein Doppelpunkt folgt. –