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 }