2017-03-08 5 views
0

私はできるだけNSクラスを除去しながら迅速な3への変換を開始したが、彼のコードで思わぬ障害に走っています:スウィフト3変換emcompassing muliple問題

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)); 

私が取得エラー

引数の型 'レンジ' (aka'Range ')

を期待するタイプ 'NSRange'(別名 '_NSRange')の値を変換できません。

おそらく、問題の理由は、即時のデータ型/クラスをNSと混在させていると思います。

ここではmos cleanソリューションはNSRangeをRangeにキャストするだけですか?または正規表現を使用する必要があるときに完全に動く方法がありますか?

答えて

1

スウィフトRangeNSRangeは異なるものです。関数は、..<演算子を使用して作成できるSwift範囲を期待しているようです。代わりに

NSRange(location: 0, length: S.characters.count) 

書き込み

0 ..< S.characters.count 

の両者は、同じ文字セットを表すが、上記の二つのことが意味論に同一ではないことに注意してください。 NSRangeは開始位置と文字シーケンスの長さをとります。 Swift Rangeは下限と上限を使用します(上限は除外されます)。

+0

問題は、正規表現からmatch.rangeAt(m)を使用する必要があることです。私は何とか結果を変換することができます、それはS.substringにすることができますか? – Tom

1

最も簡単な方法は、あなたがNSRangeRange<String.Index>を変換し、このString拡張を実装する混合型を使用しない場合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)) 
} 

に文字列を埋めることです。

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)) 
} 
関連する問題