2016-08-07 3 views
0

私はそのようなケースがあります。String.endIndexインクリメントエラー

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

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

最後の行は、ランタイムエラー発生「致命的なエラー:endIndexのをインクリメントすることはできません」。スワップは、最大のものの次のインデックスが何であるかを知らないために起こります。このソリューションは、迅速な* 1のためだけに機能します。しかし、新しい迅速なバージョンのためにこの問題を簡潔に解決する方法はありますか?
回答ありがとうございます。

答えて

4

二つの問題があります。

  • fieldName.endIndexは、それが何の後継者を持っていない文字列の「一端過去」の位置、 です。
  • の添字に1つの文字列のインデックスを使用しないでください。文字列に "基本多言語面"(Emojis、flags、...)の外に 文字が含まれていると、になることがありますが、 は実行時例外でクラッシュする可能性があります。

ワーキング・バリアントは、(スウィフト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") 
} 

または代わり:

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

あなたは、フィールド場合、制約

where range.startIndex == versionField.startIndex 

を削除することができますanywherを見つける必要があります文字列のe。

スウィフト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") 
} 

または代替的に、OPは `"フィールド名= "VERSION" `しない`フィールド名= "バージョンを持っていること

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

注:" 'ので、私はそれを推測します – Moritz

+1

@EricAya:コードを簡素化するために変更しました。「range.endIndex.advancedBy(1)」は、 'versionField'の終わりですので、最初にチェックしなければなりません。バージョンフィールドにコロンが続くことを確認しないでください。 –