SNSなどのアプリでプロフィールにWebリンクを追加したい場合があると思いますが、サーバーに文字列などの情報を実際に送る前にクライアント側で有効なURLかどうかを判断したい場合の実装です。
NSTextCheckingType
とNSDataDetector
を使った方法です。
とりあえず実装例。
protocol Validator {
func validateURL(urlString: String) -> Bool
}
extension Validator {
func validateURL(urlString: String) -> Bool {
var result = false
let types: NSTextCheckingType = .Link
let detector = try? NSDataDetector(types: types.rawValue)
guard let detect = detector else {
return result
}
let matches = detect.matchesInString(urlString, options: .ReportCompletion, range: NSMakeRange(0, urlString.characters.count))
for match in matches {
if let url = match.URL {
print("url \(url)")
result = true
}
}
return result
}
}
色々なValidationメソッドを今後も追加したいのでprotocol extensionを採用しました。
NSRegularExpression
を使って、
try! NSRegularExpression(pattern: "https?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?", options: NSRegularExpressionOptions(rawValue: 0))
のようなパターンを作ってmatchをチェックする方法もあると思いますが、自前で正規表現を用意しなくても基本的な機能なら上の二つのクラスを使ってまかなえそうです。
NSRegularExpression
はハッシュタグの検索とか
try! NSRegularExpression(pattern: "#(\\w+)", options: NSRegularExpressionOptions(rawValue: 0))
NSTextCheckingType
が用意していないケースのマッチを探す場合だけでいいかなと思いました。
NSTextCheckingType
は現在
・Orthography
・Spelling
・Grammar
・Date
・Address
・Link
・Quote
・Dash
・Replacement
・Correction
・RegularExpression
・PhoneNumber
・TransitInformation
があるので用途に応じて使っていこうと思います。