如何修改 NSPredicate 以忽略 Swift 中的空格?
How can I modify NSPredicate to ignore whitespaces in Swift?
我正在过滤 CNContact
phoneNumbers
以查看拨打的号码是否包含在 contact's
号码中。下面的附加代码工作正常,但是.....
我的问题:如果 phone 号码里面没有空格,工作正常,但如果我搜索“0761”并且联系人的 phone 号码是“076 1”,它会忽略它。
我正在使用 NSPredicate
。代码:
func filterAndGetCurrentPhoneNumber(c: CNContact) -> String{
let searchPredicate = NSPredicate(format: "SELF.value.stringValue CONTAINS[c] %@", self.txtf_dial.text!)
let array = (c.phoneNumbers as NSArray).filteredArrayUsingPredicate(searchPredicate)
if array.count > 0{
let str: String? = ((array[0] as! CNLabeledValue).value as! CNPhoneNumber).stringValue
if str != nil {
return str!;
}
}
return ""
}
如何修改 NSPredicate
以忽略 swift 中的空格?
NSPredicate
没有这样的搜索选项,因此您需要自己执行过滤。不过,与其使用 predicateWithBlock:
,不如坚持使用 Swift 标准库。
// an extension to make the string processing calls shorter
extension String {
func numericString() -> String {
// split and rejoin to filter out the non-numeric chars
let set = NSCharacterSet.decimalDigitCharacterSet().invertedSet
return self.componentsSeparatedByCharactersInSet(set).joinWithSeparator("")
}
}
// your function
func filteredPhone(c: CNContact, filterText: String) -> String {
// conform the query string to the same character set as the way we want to search target strings
let query = filterText.numericString()
// filter the phone numbers
let filtered = c.phoneNumbers.filter({ val in
let phone = (val.value as! CNPhoneNumber).stringValue
// conform the target string to numeric characters only
let conformed = phone.numericString()
return conformed.containsString(query)
})
if let result = filtered.first?.value as? CNPhoneNumber {
return result.stringValue
} else {
return ""
}
}
// test case
let contact = CNMutableContact()
contact.phoneNumbers = [CNLabeledValue(label: CNLabelHome, value: CNPhoneNumber(stringValue: "867-5309"))]
filteredPhone(contact, filterText: "753")
顺便说一句...我基本上没有改变您的函数的界面。但是除非在 UI 中使用空字符串作为此函数的结果很重要,否则通常最好使用可选的 return 值来指示缺少搜索结果——这样调用此函数的代码可以区分 return 没有结果的搜索和结果为空字符串的搜索之间的区别。
您可以使用 trimmingCharacters()
trim — 从开头去除空格(或其他字符)并
字符串的结尾。
例如:"hello" == "你好" == "hello " == "你好"
"hello world" == “你好世界” == "hello world " == “你好世界”
string.trimmingCharacters(在:.whitespacesAndNewlines)
我正在过滤 CNContact
phoneNumbers
以查看拨打的号码是否包含在 contact's
号码中。下面的附加代码工作正常,但是.....
我的问题:如果 phone 号码里面没有空格,工作正常,但如果我搜索“0761”并且联系人的 phone 号码是“076 1”,它会忽略它。
我正在使用 NSPredicate
。代码:
func filterAndGetCurrentPhoneNumber(c: CNContact) -> String{
let searchPredicate = NSPredicate(format: "SELF.value.stringValue CONTAINS[c] %@", self.txtf_dial.text!)
let array = (c.phoneNumbers as NSArray).filteredArrayUsingPredicate(searchPredicate)
if array.count > 0{
let str: String? = ((array[0] as! CNLabeledValue).value as! CNPhoneNumber).stringValue
if str != nil {
return str!;
}
}
return ""
}
如何修改 NSPredicate
以忽略 swift 中的空格?
NSPredicate
没有这样的搜索选项,因此您需要自己执行过滤。不过,与其使用 predicateWithBlock:
,不如坚持使用 Swift 标准库。
// an extension to make the string processing calls shorter
extension String {
func numericString() -> String {
// split and rejoin to filter out the non-numeric chars
let set = NSCharacterSet.decimalDigitCharacterSet().invertedSet
return self.componentsSeparatedByCharactersInSet(set).joinWithSeparator("")
}
}
// your function
func filteredPhone(c: CNContact, filterText: String) -> String {
// conform the query string to the same character set as the way we want to search target strings
let query = filterText.numericString()
// filter the phone numbers
let filtered = c.phoneNumbers.filter({ val in
let phone = (val.value as! CNPhoneNumber).stringValue
// conform the target string to numeric characters only
let conformed = phone.numericString()
return conformed.containsString(query)
})
if let result = filtered.first?.value as? CNPhoneNumber {
return result.stringValue
} else {
return ""
}
}
// test case
let contact = CNMutableContact()
contact.phoneNumbers = [CNLabeledValue(label: CNLabelHome, value: CNPhoneNumber(stringValue: "867-5309"))]
filteredPhone(contact, filterText: "753")
顺便说一句...我基本上没有改变您的函数的界面。但是除非在 UI 中使用空字符串作为此函数的结果很重要,否则通常最好使用可选的 return 值来指示缺少搜索结果——这样调用此函数的代码可以区分 return 没有结果的搜索和结果为空字符串的搜索之间的区别。
您可以使用 trimmingCharacters()
trim — 从开头去除空格(或其他字符)并 字符串的结尾。
例如:"hello" == "你好" == "hello " == "你好"
"hello world" == “你好世界” == "hello world " == “你好世界”
string.trimmingCharacters(在:.whitespacesAndNewlines)