将Range <int>转换为Range <string.index> </string.index> </int>

时间:2014-11-26 18:58:36

标签: ios string swift range nsrange

给定NSString的以下函数,从该字符串中删除HTML标记,并将结果也返回为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;
}

我试图用纯粹的Swift重写它。我在Swift中遇到Range类型的问题。

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

所以我将变量声明为var range = Range(start: 0, end: 0),但现在我遇到了一些新错误。

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

range = sourceString.rangeOfString(HTMLTags, options: NSStringCompareOptions.RegularExpressionSearch)

'Int'与'String.Index'不一致

sourceString = sourceString.stringByReplacingCharactersInRange(range, withString: "")

我搜索了一个解决方案,并遇到了post。然后我将range变量声明更改为此。

var range = Range<String.Index>(start: 0, end: 0)

但我现在收到这个新错误! 通话中的额外参数'结束'

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

谢谢。

4 个答案:

答案 0 :(得分:8)

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

如果您替换NSString方法stringByReplacingCharactersInRange() 通过Swift String方法replaceRange()(或者在这种情况下 只需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;
}

答案 1 :(得分:2)

在Swift 2中,给定string: StringnsRange: NSRange,这是

let range = Range(start: string.startIndex.advancedBy(nsRange.location),
    end: string.startIndex.advancedBy(nsRange.location+nsRange.length))

答案 2 :(得分:0)

用于function billingReport(){ var sDate = new Date(document.getElementById("startDate").value); var table = document.getElementById("results1"); var row, cell1, cell2, cell3, cell4, scores; var tableHeaderRowCount = 1; var rowCount = table.rows.length; for (var i = tableHeaderRowCount; i < rowCount; i++) { table.deleteRow(tableHeaderRowCount); } Parse.Cloud.run("runReport", {sDate: sDate}).then(function(data){ scores = data; console.log("Successfully retrieved " + scores.length + " scores."); return Parse.Promise.when(scores.map(function(score){ return Parse.Cloud.run("caseHelper", {id: score.attributes.customer.id, className: "User", attribute: "username"}); })); }).then(function(results){ for(var i = 0; i < scores.length; i++){ row = table.insertRow(i); cell1 = row.insertCell(0); cell2 = row.insertCell(1); cell3 = row.insertCell(2); cell4 = row.insertCell(3); cell1.innerHTML = scores[i].id; cell2.innerHTML = scores[i].attributes.title; cell3.innerHTML = scores[i].attributes.hoursWorked; cell4.innerHTML = results[i]; } }).fail(function(err){ console.log("Error creating report :" + err); }); } 下标,StringNSRange次转化的瑞士军用蒸汽铲

Range<Int|String.Index>

Gist here

答案 3 :(得分:0)

NSRange转换为Range<String.Index> swift函数

func rangeWithString(string : String, range : NSRange) -> Range<String.Index> {
    return string.startIndex.advancedBy(range.location) ..< string.startIndex.advancedBy(range.location+range.length)
}