我已经开始转换为swift 3,同时尽可能地删除 NS 类,但是遇到了他的代码:
var S: String = ADataItem.description_text;
// FRegExBufui_Image is of type NSRegularExpression
let matches: [NSTextCheckingResult] = FRegexBufUI_Image.matches(in: S, options: NSRegularExpression.MatchingOptions(), range: NSRange(location: 0, length: S.characters.count));
if matches.count > 0 {
for m in 0 ..< matches.count {
S = S.substring(with: match.rangeAt(m));
我收到错误
无法转换类型的值&#39; NSRange&#39; (又名&#39; _NSRange&#39;)预期 参数类型&#39;范围&#39; (又名&#39;范围&#39)
我想也许问题的原因是我现在将swift数据类型/类与 NS 混合在一起。
这里的清洁解决方案......只是简单地将NSRange投射到Range?或者,当我需要使用正则表达式时,有没有办法完全使用Swift?
答案 0 :(得分:1)
Swift Range
和NSRange
是不同的东西。看起来该函数期望您可以使用..<
运算符创建的Swift范围。而不是
NSRange(location: 0, length: S.characters.count)
写
0 ..< S.characters.count
请注意,上述两个内容在语义上并不相同,尽管它们都代表相同的字符集。 NSRange
获取起始位置和字符序列的长度。 Swift Range
使用下限和上限(不包括上限)。
答案 1 :(得分:1)
最简单的方法是将字符串桥接到NSString
let matches = FRegexBufUI_Image.matches(in: S, options: NSRegularExpression.MatchingOptions(), range: NSRange(location: 0, length: S.characters.count));
for match in matches { // don't use ugly C-style index based loops
let substring = (S as NSString).substring(with: match.rangeAt(m))
}
如果您不想使用混合类型,请实施此String
扩展程序,将Range<String.Index>
转换为NSRange
:
extension String {
func range(from nsRange: NSRange) -> Range<String.Index>? {
guard
let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex),
let to16 = utf16.index(from16, offsetBy: nsRange.length, limitedBy: utf16.endIndex),
let from = String.Index(from16, within: self),
let to = String.Index(to16, within: self)
else { return nil }
return from ..< to
}
func substring(withNSRange range : NSRange) -> String
{
let swiftRange = self.range(from : range)
return swiftRange != nil ? self.substring(with: swiftRange!) : self
}
}
并使用它:
for match in matches { // don't use ugly C-style index based loops
let substring = S.substring(withNSRange: match.rangeAt(m))
}