Swift 3转换包含多个问题

时间:2017-03-08 15:18:28

标签: swift3

我已经开始转换为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?

2 个答案:

答案 0 :(得分:1)

Swift RangeNSRange是不同的东西。看起来该函数期望您可以使用..<运算符创建的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))
}