给定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)
但我现在收到这个新错误! 通话中的额外参数'结束'
我无法找到解决这个问题的方法。有人可以帮忙吗?
谢谢。
答案 0 :(得分:8)
Swift String
方法rangeOfString()
会返回一个可选的Range?
没有location
属性,但可以使用条件绑定(if let
)进行检查。
如果您替换NSString
方法stringByReplacingCharactersInRange()
通过Swift String
方法replaceRange()
(或者在这种情况下
只需removeRange()
),您就可以完全使用Range<Swift.Index>
不将其转换为NSRange
或Range<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: String
和nsRange: 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);
});
}
下标,String
,NSRange
次转化的瑞士军用蒸汽铲
Range<Int|String.Index>
答案 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)
}