Swift startsWith方法?
在Swift中是否有像startsWith()方法或类似的东西?
我基本上试图检查某个string是否以另一个string开头。 我也希望它是不区分大小写的。
正如你可能知道的那样,我只是想做一个简单的searchfunction,但是我似乎在这方面做得不好。
这是我想要的:
input“sa”应该给我“圣安东尼奥”,“圣达菲”等的结果,input“SA”或“Sa”或甚至“sA”也应该返回“圣安东尼奥”或“圣达菲”。
我正在使用
self.rangeOfString(find, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil
在iOS9之前,它工作得很好。 但升级到iOS9后,它停止工作,现在search区分大小写。
var city = "San Antonio" var searchString = "san " if(city.rangeOfString(searchString, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil){ print("San Antonio starts with san "); } var myString = "Just a string with san within it" if(myString.rangeOfString(searchString, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil){ print("I don't want this string to print bc myString does not start with san "); }
使用hasPrefix
而不是startsWith
。
例:
"hello dolly".hasPrefix("hello") // This will return true "hello dolly".hasPrefix("abc") // This will return false
这里是一个Swift扩展实现的startsWith:
extension String { func startsWith(string: String) -> Bool { guard let range = rangeOfString(string, options:[.AnchoredSearch, .CaseInsensitiveSearch]) else { return false } return range.startIndex == startIndex } }
用法示例:
var str = "Hello, playground" let matches = str.startsWith("hello") //true let no_matches = str.startsWith("playground") //false
编辑:更新为Swift 3。
Swift中的String类有区分大小写的方法hasPrefix()
,但是如果你想要不区分大小写的search,你可以使用NSString方法range(of:options:)
。
注意:默认情况下,NSString方法不可用,但是如果你import Foundation
的话。
所以:
import Foundation var city = "San Antonio" var searchString = "san " let range = city.range(of: searchString, options:.caseInsensitive) if let range = range { print("San Antonio starts with san at \(range.startIndex)"); }
这些选项可以是.caseInsensitive
或[.caseInsensitive]
。 如果您想使用其他选项,则可以使用第二个选项,例如:
let range = city.range(of: searchString, options:[.caseInsensitive, .backwards])
要特别回答不区分大小写的前缀匹配:
在纯粹的斯威夫特(推荐大部分时间)
extension String { func caseInsensitiveHasPrefix(_ prefix: String) -> Bool { return lowercased().hasPrefix(prefix.lowercased()) } }
使用基金会range(of:options:)
extension String { func caseInsensitiveHasPrefix(_ prefix: String) -> Bool { return range(of: prefix, options: [.anchored, .caseInsensitive]) != nil } }
和一个正则expression式丑(我见过…)
extension String { func caseInsensitiveHasPrefix(_ prefix: String) -> Bool { guard let expression = try? NSRegularExpression(pattern: "\(prefix)", options: [.caseInsensitive, .ignoreMetacharacters]) else { return false } return expression.firstMatch(in: self, options: .anchored, range: NSRange(location: 0, length: characters.count)) != nil } }
在swift 4 func starts<PossiblePrefix>(with possiblePrefix: PossiblePrefix) -> Bool where PossiblePrefix : Sequence, String.Element == PossiblePrefix.Element
将被引入。
使用示例:
let a = 1...3 let b = 1...10 print(b.starts(with: a)) // Prints "true"
Swift 3版本:
func startsWith(string: String) -> Bool { guard let range = range(of: string, options:[.caseInsensitive]) else { return false } return range.lowerBound == startIndex }