はじめに(Introduction)
Swift 3でStringからURLの配列を抽出したい場合、どう書くか。
(How do we write if we want to extract an array of URLs from a String in Swift 3?)
記述例(Implementation)
文字列を渡すと、URLの配列を返します。
(After passing the string, an array of URLs will be returned.)
class LinkHelper: NSObject {
class func extractURL(_ string:String)-> [URL]{
let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let links = detector.matches(in: string, range: NSMakeRange(0, string.characters.count))
return links.flatMap { $0.url }
}
}
(2016/11/16追記: @woxtuさんのご指摘で、flatMapを使った記述にコードを改善しました。ありがとうございます。)
こうすれば、URLが2つarray
に入ります。
(Two of the URL will be placed in array
.)
let string = "プロフィールページ http://qiita.com/hsylife PickerをPopoverで表示するライブラリの紹介 http://qiita.com/hsylife/items/e54ae8bde0838db53ae3"
let array = LinkHelper.extractURL(string)
条件(Required)
init(types checkingTypes: NSTextCheckingTypes) throwsは、iOS8.0+, watchOS 2.0+が必須です。
発展(Development)
typesの.linkを.phoneNumberに変更すると、同じような構造で、電話番号文字列の配列を抽出をさせることができますね。
(If you change the type's .link to .phoneNumber, you can have the same structure for extracting an array of phone number strings.)
その他の種類については一覧表に説明があります。
(Other types are explained in the table.)
関連リンク(Links)
余談。英語を併記してみました。Google Translationの結果をほぼ90%くらいそのまま使っています。閲覧者側でページ単位の翻訳をしてもらえると併記不要なのですが、まだ検索結果はオリジナル言語に依存していると思うので、過渡的な措置として英語併記が必要で、省力化のためにGoogle 翻訳が便利だという実感を得ました。おすすめです。