如何检查 UISearchBar.text 是否包含 URL?我想过做这样的事情:
if (searchBar.text == NSTextCheckingType.Link) {
}
但我得到了错误:
String is not convertible to NSObject
如何检查 UISearchBar.text 是否包含 URL?我想过做这样的事情:
if (searchBar.text == NSTextCheckingType.Link) {
}
但我得到了错误:
String is not convertible to NSObject
我增强了Imanou PETIT
's 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
}
}
一个示例用法:
var urls = text.extractURLs
for url in urls {
// do stuff with your URL
if UIApplication.sharedApplication().canOpenURL(url) {
UIApplication.sharedApplication().openURL(url)
break
}
}
使用 Swift 3,您可以使用NSDataDetector
. NSDataDetector
有一个名为init(types:)
. init(types:)
有以下声明:
init(types checkingTypes: NSTextCheckingTypes) throws
初始化并返回一个数据检测器实例。
为了创建一个查找 url 的数据检测器,您必须将NSTextCheckingResult.CheckingType.link作为init(types:)
.
NSDataDetector
andNSRegularExpression
的enumerateMatches(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)
枚举允许 Block 处理每个正则表达式匹配的字符串。
下面的 Playground 代码显示了如何使用NSDataDetector
和enumerateMatches(in:options:range:using:)
方法来检测 a 是否String
包含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)
*/
NSDataDetector
andNSRegularExpression
的matches(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 代码显示了如何使用NSDataDetector
和matches(in:options:range:)
方法来检测 a 是否String
包含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 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)
*/