将Range <Int>转换为Range <String.Index>

Isu*_*uru 9 string range ios nsrange swift

给定a的下面的函数NSString从该字符串中删除HTML标记并将结果也作为a返回NSString.

private func removeHTMLTags(source: NSString) -> NSString {
    var range = NSMakeRange(0, 0)
    let HTMLTags = "<[^>]*>"
    var sourceString = source

    while sourceString.rangeOfString(HTMLTags, options: NSStringCompareOptions.RegularExpressionSearch).location != NSNotFound {
        range = sourceString.rangeOfString(HTMLTags, options: NSStringCompareOptions.RegularExpressionSearch)
        sourceString = sourceString.stringByReplacingCharactersInRange(range, withString: "")
    }
    return sourceString;
}
Run Code Online (Sandbox Code Playgroud)

我试图用纯粹的Swift重写它.我Range在Swift中面临类型问题.

在原始代码函数中,range变量声明为type NSRange.在我的版本中,我不能这样做,因为sourceString.rangeOfString(HTMLTags, options: NSStringCompareOptions.RegularExpressionSearch)while循环中的行返回类型Range<String.Index>,它会给我错误无法将表达式的类型'()'转换为'NSRange'类型.

所以我声明了这个变量,var range = Range(start: 0, end: 0)但现在我得到了一些新的错误.

无法将表达式的类型'()'转换为在行中键入'Range'错误

range = sourceString.rangeOfString(HTMLTags, options: NSStringCompareOptions.RegularExpressionSearch)
Run Code Online (Sandbox Code Playgroud)

并且'Int'与该行的'String.Index'不同

sourceString = sourceString.stringByReplacingCharactersInRange(range, withString: "")
Run Code Online (Sandbox Code Playgroud)

我搜索了一个解决方案,并发现了这篇文章.然后我将range变量声明更改为此.

var range = Range<String.Index>(start: 0, end: 0)
Run Code Online (Sandbox Code Playgroud)

但我现在得到这个新错误!调用中的额外参数'end'

我无法找到解决这个问题的方法.有人可以帮忙吗?

谢谢.

Mar*_*n R 8

Swift String方法rangeOfString()返回一个可选项Range?,它没有location属性但可以使用条件绑定(if let)进行检查.

如果你更换NSString方法stringByReplacingCharactersInRange() 由斯威夫特StringreplaceRange()(或在这种情况下,简单地通过removeRange()),那么你完全可以利用工作,Range<Swift.Index> 而无需将其转换为NSRangeRange<Int>.

func removeHTMLTags(source : String) -> String {

    var sourceString = source
    let HTMLTags = "<[^>]*>"

    while let range = sourceString.rangeOfString(HTMLTags, options: .RegularExpressionSearch) {
        sourceString.removeRange(range)
    }

    return sourceString;
}
Run Code Online (Sandbox Code Playgroud)