String.endIndex递增错误

时间:2016-08-07 11:30:16

标签: swift string

我有这样的案例:

TextView textView =(TextView)findViewById(R.id.textView);
textView.setClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href='http://www.google.com'> Google </a>";
textView.setText(Html.fromHtml(text));

最后一行生成运行时错误“致命错误:无法递增endIndex”。之所以发生这种情况,是因为swift不知道下一个指数在最大指数之后是什么。看起来这个解决方案仅适用于swift 1. *。但有没有办法简洁地解决这个问题的新版本? 谢谢你的回答。

1 个答案:

答案 0 :(得分:4)

有两个问题:

  • fieldName.endIndex是&#34;结束时的一个&#34;弦的位置, 它没有继承者。
  • 您不得使用一个字符串的索引作为下标 不同的字符串。那些可能在某些情况下有效,但可以 如果字符串包含,则运行时异常崩溃 &#34;基本多语言平面之外的人物&#34; (Emojis,旗帜......)。

工作变体是( 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")
}

或者:

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

如果字段应该在字符串中的任何位置找到。

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

或者,

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