Swift:检查UISearchBar.text是否包含url

Swift:检查UISearchBar.text是否包含url,swift,string,cocoa-touch,nsdatadetector,Swift,String,Cocoa Touch,Nsdatadetector,如何检查UISearchBar.text是否包含URL?我想做这样的事情: if (searchBar.text == NSTextCheckingType.Link) { } 但我得到了一个错误: String is not convertible to NSObject 使用Swift 3,您可以使用NSDataDetectorNSDataDetector有一个名为的初始值设定项init(类型:)具有以下声明: init(types checkingTypes: NSTextCheck

如何检查UISearchBar.text是否包含URL?我想做这样的事情:

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

}
但我得到了一个错误:

String is not convertible to NSObject

使用Swift 3,您可以使用
NSDataDetector
NSDataDetector
有一个名为的初始值设定项
init(类型:)
具有以下声明:

init(types checkingTypes: NSTextCheckingTypes) throws
func enumerateMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, NSRegularExpression.MatchingFlags, UnsafeMutablePointer<ObjCBool>) -> Void)
func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]
初始化并返回数据检测器实例

为了创建查找URL的数据检测器,您必须作为
init(types:)
的参数传递


#1.使用
NSDataDetector
NSRegularExpression
枚举匹配项(在:选项:范围:使用:)方法 作为
NSRegularExpression
的子类,
NSDataDetector
有一个名为的方法<代码>枚举匹配项(in:options:range:using:)具有以下声明:

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

#2.使用
NSDataDetector
NSRegularExpression
匹配(在:选项:范围:)
方法 作为
NSRegularExpression
的子类,
NSDataDetector
有一个名为的方法<代码>匹配项(在:选项:范围:)具有以下声明:

init(types checkingTypes: NSTextCheckingTypes) throws
func enumerateMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, NSRegularExpression.MatchingFlags, UnsafeMutablePointer<ObjCBool>) -> Void)
func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]
返回一个数组,该数组包含字符串中正则表达式的所有匹配项

这是一个方便的方法,可以调用
枚举匹配(in:options:range:using:)
传递适当的字符串、选项和范围

下面的代码显示了如何使用
NSDataDetector
匹配(in:options:range:)
方法来检测
字符串是否包含
URL
s:

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)
 */
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)
 */

使用Swift 3,您可以使用
NSDataDetector
NSDataDetector
有一个名为的初始值设定项
init(类型:)
具有以下声明:

init(types checkingTypes: NSTextCheckingTypes) throws
func enumerateMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, NSRegularExpression.MatchingFlags, UnsafeMutablePointer<ObjCBool>) -> Void)
func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]
初始化并返回数据检测器实例

为了创建查找URL的数据检测器,您必须作为
init(types:)
的参数传递


#1.使用
NSDataDetector
NSRegularExpression
枚举匹配项(在:选项:范围:使用:)
方法 作为
NSRegularExpression
的子类,
NSDataDetector
有一个名为的方法<代码>枚举匹配项(in:options:range:using:)具有以下声明:

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

#2.使用
NSDataDetector
NSRegularExpression
匹配(在:选项:范围:)
方法 作为
NSRegularExpression
的子类,
NSDataDetector
有一个名为的方法<代码>匹配项(在:选项:范围:)具有以下声明:

init(types checkingTypes: NSTextCheckingTypes) throws
func enumerateMatches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange, using block: (NSTextCheckingResult?, NSRegularExpression.MatchingFlags, UnsafeMutablePointer<ObjCBool>) -> Void)
func matches(in string: String, options: NSRegularExpression.MatchingOptions = [], range: NSRange) -> [NSTextCheckingResult]
返回一个数组,该数组包含字符串中正则表达式的所有匹配项

这是一个方便的方法,可以调用
枚举匹配(in:options:range:using:)
传递适当的字符串、选项和范围

下面的代码显示了如何使用
NSDataDetector
匹配(in:options:range:)
方法来检测
字符串是否包含
URL
s:

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)
 */
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)
 */

我增强了Imanou PETIT的anwser

这允许您从字符串中提取多个URL

extension String {
    var extractURLs: [NSURL] {
        var urls : [NSURL] = []
        var error: NSError?
        let detector = NSDataDetector(types: NSTextCheckingType.Link.rawValue, error: &error)

        var text = self

        detector!.enumerateMatchesInString(text, options: nil, range: NSMakeRange(0, count(text)), usingBlock: { (result: NSTextCheckingResult!, flags: NSMatchingFlags, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
            //            println("\(result)")
            //            println("\(result.URL)")
            urls.append(result.URL!)
        })

        return urls
    }
}

我增强了Imanou PETIT的anwser

这允许您从字符串中提取多个URL

extension String {
    var extractURLs: [NSURL] {
        var urls : [NSURL] = []
        var error: NSError?
        let detector = NSDataDetector(types: NSTextCheckingType.Link.rawValue, error: &error)

        var text = self

        detector!.enumerateMatchesInString(text, options: nil, range: NSMakeRange(0, count(text)), usingBlock: { (result: NSTextCheckingResult!, flags: NSMatchingFlags, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
            //            println("\(result)")
            //            println("\(result.URL)")
            urls.append(result.URL!)
        })

        return urls
    }
}

我收到一个错误,说NSTextCheckingType不能转换为字符串。我收到一个错误,说NSTextCheckingType不能转换为字符串。虽然我很久以前就解决了这个问题,但这非常有帮助,谢谢。虽然我很久以前就解决了这个问题,但这非常有帮助,谢谢。