Ответ 1
используйте hasPrefix
вместо startsWith
.
Пример:
"hello dolly".hasPrefix("hello") // This will return true
"hello dolly".hasPrefix("abc") // This will return false
Есть ли такая вещь, как метод startWith() или что-то подобное в Swift?
В основном я пытаюсь проверить, начинается ли определенная строка с другой строки. Я также хочу, чтобы это было нечувствительным к регистру.
Как вы могли бы сказать, я просто пытаюсь сделать простую функцию поиска, но я, кажется, терпит неудачу в этом.
Вот что мне хотелось бы:
Набрав в "sa", должен дать мне результаты для "Сан-Антонио", "Санта-Фе" и т.д. ввод в "SA" или "Sa" или даже "sA" также должен возвращать "Сан-Антонио" или "Санта-Фе".
Я использовал
self.rangeOfString(find, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil
до iOS9, и он работал нормально. Однако после обновления до iOS9 он перестает работать, и теперь поиск чувствителен к регистру.
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 для начинающихWith:
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
Чтобы ответить конкретно на регистр без учета соответствия префиксов:
extension String {
func caseInsensitiveHasPrefix(_ prefix: String) -> Bool {
return lowercased().hasPrefix(prefix.lowercased())
}
}
или же:
extension String {
func caseInsensitiveHasPrefix(_ prefix: String) -> Bool {
return lowercased().starts(with: prefix.lowercased())
}
}
примечание: для пустого префикса ""
обе реализации вернут true
range(of:options:)
Foundation range(of:options:)
extension String {
func caseInsensitiveHasPrefix(_ prefix: String) -> Bool {
return range(of: prefix, options: [.anchored, .caseInsensitive]) != nil
}
}
примечание: для пустого префикса ""
он вернет false
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
}
}
примечание: для пустого префикса ""
он вернет false
Редактировать: обновлено для Swift 3.
Класс Swift String имеет метод hasPrefix()
регистра с учетом регистра hasPrefix()
, но если вы хотите hasPrefix()
регистра, вы можете использовать range(of:options:)
метода 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])
Этот подход также имеет преимущество, заключающееся в возможности использовать другие параметры поиска, такие как поиск .diacriticInsensitive
. Тот же результат не может быть достигнут просто с помощью . lowercased()
. lowercased()
в строках.
В быстрый 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
}
В Swift 4 с расширениями
Мой разгибания пример содержит 3 функции: проверка сделать строки начинаются с подстроки, сделать конец строки в подстроку и сделать строка содержит подстроку.
Установите для параметра isCaseSensitive значение false, если вы хотите игнорировать символы "A" или "a", в противном случае установите для него значение true.
Смотрите комментарии в коде для получения дополнительной информации о том, как это работает.
Код:
import Foundation
extension String {
// Returns true if the String starts with a substring matching to the prefix-parameter.
// If isCaseSensitive-parameter is true, the function returns false,
// if you search "sA" from "San Antonio", but if the isCaseSensitive-parameter is false,
// the function returns true, if you search "sA" from "San Antonio"
func hasPrefixCheck(prefix: String, isCaseSensitive: Bool) -> Bool {
if isCaseSensitive == true {
return self.hasPrefix(prefix)
} else {
var thePrefix: String = prefix, theString: String = self
while thePrefix.count != 0 {
if theString.count == 0 { return false }
if theString.lowercased().first != thePrefix.lowercased().first { return false }
theString = String(theString.dropFirst())
thePrefix = String(thePrefix.dropFirst())
}; return true
}
}
// Returns true if the String ends with a substring matching to the prefix-parameter.
// If isCaseSensitive-parameter is true, the function returns false,
// if you search "Nio" from "San Antonio", but if the isCaseSensitive-parameter is false,
// the function returns true, if you search "Nio" from "San Antonio"
func hasSuffixCheck(suffix: String, isCaseSensitive: Bool) -> Bool {
if isCaseSensitive == true {
return self.hasSuffix(suffix)
} else {
var theSuffix: String = suffix, theString: String = self
while theSuffix.count != 0 {
if theString.count == 0 { return false }
if theString.lowercased().last != theSuffix.lowercased().last { return false }
theString = String(theString.dropLast())
theSuffix = String(theSuffix.dropLast())
}; return true
}
}
// Returns true if the String contains a substring matching to the prefix-parameter.
// If isCaseSensitive-parameter is true, the function returns false,
// if you search "aN" from "San Antonio", but if the isCaseSensitive-parameter is false,
// the function returns true, if you search "aN" from "San Antonio"
func containsSubString(theSubString: String, isCaseSensitive: Bool) -> Bool {
if isCaseSensitive == true {
return self.range(of: theSubString) != nil
} else {
return self.range(of: theSubString, options: .caseInsensitive) != nil
}
}
}
Примеры как использовать:
Для проверки начинайте строку с "ТЕСТ":
"testString123".hasPrefixCheck(prefix: "TEST", isCaseSensitive: true) // Returns false
"testString123".hasPrefixCheck(prefix: "TEST", isCaseSensitive: false) // Returns true
Для проверки String начинаются с "test":
"testString123".hasPrefixCheck(prefix: "test", isCaseSensitive: true) // Returns true
"testString123".hasPrefixCheck(prefix: "test", isCaseSensitive: false) // Returns true
Для проверки конец строки следует на "G123":
"testString123".hasSuffixCheck(suffix: "G123", isCaseSensitive: true) // Returns false
"testString123".hasSuffixCheck(suffix: "G123", isCaseSensitive: false) // Returns true
Для проверки конец строки следует на "G123":
"testString123".hasSuffixCheck(suffix: "g123", isCaseSensitive: true) // Returns true
"testString123".hasSuffixCheck(suffix: "g123", isCaseSensitive: false) // Returns true
Для проверки строка содержит "RING12":
"testString123".containsSubString(theSubString: "RING12", isCaseSensitive: true) // Returns false
"testString123".containsSubString(theSubString: "RING12", isCaseSensitive: false) // Returns true
Для проверки в строке есть "ring12":
"testString123".containsSubString(theSubString: "ring12", isCaseSensitive: true) // Returns true
"testString123".containsSubString(theSubString: "ring12", isCaseSensitive: false) // Returns true