1

UISearchBar.text に URL が含まれているかどうかを確認するにはどうすればよいですか? 私はこのようなことを考えました:

if (searchBar.text == NSTextCheckingType.Link) {

}

しかし、私はエラーが発生します:

String is not convertible to NSObject
4

2 に答える 2

3

Swift 3 では、 を使用できますNSDataDetectorNSDataDetectorと呼ばれるイニシャライザがありますinit(types:)init(types:)次の宣言があります。

init(types checkingTypes: NSTextCheckingTypes) throws

データ検出インスタンスを初期化して返します。

URL を検出するデータ検出器を作成するには、NSTextCheckingResult.CheckingType.linkを のパラメーターとして渡す必要がありますinit(types:)


#1。NSDataDetectorNSRegularExpressionenumerateMatches(in:options:range:using:)メソッドの使用

のサブクラスとしてNSRegularExpression、 にNSDataDetectorは というメソッドがありenumerateMatches(in:options:range:using:)ます。enumerateMatches(in:options:range:using:)次の宣言があります。

func enumerateMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, NSRegularExpression.MatchingFlags, UnsafeMutablePointer<ObjCBool>) -> Void)

ブロックが各正規表現の一致を処理できるようにする文字列を列挙します。

以下の Playground コードは、 a にsが含まれているかどうかを検出するためにNSDataDetectorandenumerateMatches(in:options:range:using:)メソッドを使用する方法を示しています。StringURL

import Foundation

let testString = " lorem http://www.yahoo.com ipsum google.fr"

do {
    let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
    let range = NSRange(location: 0, length: testString.characters.count)
    let block = { (result: NSTextCheckingResult?, flags: NSRegularExpression.MatchingFlags, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
        if let result = result, result.resultType == NSTextCheckingResult.CheckingType.link {
            print(result.url)
        }
    }
    detector.enumerateMatches(in: testString, options: [], range: range, using: block)
} catch {
    print(error)
}

/*
 prints:
 Optional(http://www.yahoo.com)
 Optional(http://google.fr)
 */

#2。NSDataDetectorNSRegularExpressionmatches(in:options:range:)メソッドの使用

のサブクラスとしてNSRegularExpression、 にNSDataDetectorは というメソッドがありmatches(in:options:range:)ます。matches(in:options:range:)次の宣言があります。

func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]

文字列内の正規表現のすべての一致を含む配列を返します。

enumerateMatches(in:options:range:using:)これは、適切な文字列、オプション、および範囲を渡すことを呼び出す便利なメソッドです。

以下の Playground コードは、 a にsが含まれているかどうかを検出するためにNSDataDetectorandmatches(in:options:range:)メソッドを使用する方法を示しています。StringURL

import Foundation

let testString = " lorem http://www.yahoo.com ipsum google.fr"

do {
    let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
    let range = NSRange(location: 0, length: testString.characters.count)
    let resultArray = detector.matches(in: testString, options: [], range: range)
    for result in resultArray {
        if result.resultType == NSTextCheckingResult.CheckingType.link {
            print(result.url)
        }
    }
} catch {
    print(error)
}

/*
 prints:
 Optional(http://www.yahoo.com)
 Optional(http://google.fr)
 */
于 2014-08-29T18:34:49.050 に答える