6

NSDataDetector文字列からアドレスを使用しようとしています。NSHipster の記事NSDataDetectorApple の NSDataDetector のドキュメントを見てきました。文字列からアドレスを引き出すところまで、次の方法があります。

func getAddress(from dataString: String) -> [String] {
    let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.address.rawValue)
    let matches = detector.matches(in: dataString, options: [], range: NSRange(location: 0, length: dataString.utf16.count))

    var addressArray = [String]()

    // put matches into array of Strings
    for match in matches {
        let address = (dataString as NSString).substring(with: match.range)
        addressArray.append(address)
    }

    return addressArray
}

住所全体ではなく、住所の要素を抜き出したい。Data Detector の一致タイプセクションのNSHipsterNSDataDetector投稿では、 、、などのアドレス コンポーネントが表示されます。の初期化でこれらのキーを使用できません。NSTextCheckingCityKeyNSTextCheckingStateKeyNSTextCheckingZIPKeyNSDataDetector

私は GitHub を掘り下げて、盗用する例を見つけることができるかどうかを確認しましたが、見つけることができるのは、Objective-C コードまたはマスター Swift リポジトリの宣言型のものだけです。

住所の個々のコンポーネントを引き出すことができると 99% 確信していますが、それを理解するにはあまりにも愚かです。読んでくれてありがとう。提案を歓迎します。

4

2 に答える 2

9

以前にこのクラスを使用したことはありませんが、 type のオブジェクトを返すようですNSTextCheckingResult。タイプ の結果が得られた場合、そのNSTextCheckingTypeAddress結果を尋ねることができますaddressComponents。これは、住所のさまざまな部分を含む辞書になります。

編集:

これは、私が叩いたばかりのいくつかの機能する遊び場コードです。

import UIKit

var string = "Now is the time for all good programmers to babble incoherently.\n" +
"Now is the time for all good programmers to babble incoherently.\n" +
"Now is the time for all good programmers to babble incoherently.\n" +
"123 Elm Street\n" +
"Daton, OH 45404\n" +
"Now is the time for all good programmers to babble incoherently.\n" +
"2152 E Street NE\n" +
"Washington, DC 20001"

let results = getAddress(from: string)

print("matched \(results.count) addresses")
for result in results {
  let city = result[NSTextCheckingCityKey] ?? ""
  print("address dict = \(result).")
  print("    City = \"\(city)\"")
}

func getAddress(from dataString: String) -> [[String: String]] {
  let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.address.rawValue)
  let matches = detector.matches(in: dataString, options: [], range: NSRange(location: 0, length: dataString.utf16.count))

  var resultsArray =  [[String: String]]()
  // put matches into array of Strings
  for match in matches {
    if match.resultType == .address,
      let components = match.addressComponents {
      resultsArray.append(components)
    } else {
      print("no components found")
    }
  }
  return resultsArray
}

このコードは次を出力します。

一致した 2 つのアドレス

address dict = ["Street": "123 Elm Street", "ZIP": "45404", "City": "Daton", "State": "OH"]. 市=「ダトン」

address dict = ["Street": "2152 E Street NE", "ZIP": "20001", "City": "Washington", "State": "DC"]. 都市 = 「ワシントン」

于 2016-12-10T15:52:59.230 に答える