Як можна порівняти два рядки у швидкому ігноруванні регістру? наприклад:
var a = "Cash"
var b = "cash"
Чи існує якийсь метод, який поверне істину, якщо порівняти var a & var b
Як можна порівняти два рядки у швидкому ігноруванні регістру? наприклад:
var a = "Cash"
var b = "cash"
Чи існує якийсь метод, який поверне істину, якщо порівняти var a & var b
lowercaseString
що це згадується в деяких відповідях, не вдасться на деяких мовах (Straße! = STRASSE наприклад)
caseInsensitiveCompare:
& localizedCaseInsensitiveCompare:
замість цього
"Straße".localizedCaseInsensitiveCompare("STRASSE")
- Не забудьте імпортувати Foundation
)
Відповіді:
Спробуйте це:
var a = "Cash"
var b = "cash"
let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil, locale: nil)
// You can also ignore last two parameters(thanks 0x7fffffff)
//let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch)
результат - тип переліку NSComparisonResult:
enum NSComparisonResult : Int {
case OrderedAscending
case OrderedSame
case OrderedDescending
}
Тож ви можете використовувати оператор if:
if result == .OrderedSame {
println("equal")
} else {
println("not equal")
}
Спробуйте це :
Для старших швидких:
var a : String = "Cash"
var b : String = "cash"
if(a.caseInsensitiveCompare(b) == NSComparisonResult.OrderedSame){
println("voila")
}
Свіфт 3+
var a : String = "Cash"
var b : String = "cash"
if(a.caseInsensitiveCompare(b) == .orderedSame){
print("voila")
}
a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
caseInsensitiveCompare(_:)
не входить до стандартної бібліотеки Swift, навпаки, це частина Foundation
фреймворку, отже, вимагає import Foundation
.
a.lowercased() == b.lowercased()
?
caseInsensitiveCompare
Метод використання :
let a = "Cash"
let b = "cash"
let c = a.caseInsensitiveCompare(b) == .orderedSame
print(c) // "true"
Результат порівняння повідомляє, яке слово приходить раніше за інше у лексикографічному порядку (тобто яке з них наближається до передньої частини словника). .orderedSame
означає, що рядки опиняться в тому самому місці словника
.orderedSame
означає У документах просто сказано, що два операнди рівні . Але чому тут використовується слово «порядок»? Є послідовність чи щось інше? І що означає лівий операнд менше, ніж правий операнд. ( .orderedAscending
) означає для струнних
.orderedSame
означає, що рядки опиняться в тому самому місці словника.
.orderedSame
- це скорочення від ComparisonResult.orderSame
... не потрібно називати тип, оскільки компілятор знає, що caseInsensitiveCompare
повертає a ComparisonResult
. "Два операнди рівні" - вони рівні відповідно до конкретного порядку ... очевидно, "Готівка" та "Готівка" не є однаковими рядковими значеннями. "Але чому тут використовується слово" порядок "?" - тому що це результат впорядкованого порівняння. Інші цінності - це ... orderedAscending
і orderedDescending
справа не лише в тому ж чи іншому. Що стосується "менших": рядки схожі на числа у великій основі.
a.caseInsensitiveCompare(b, comparing: .orderedSame)
було б читабельніше ...
if a.lowercaseString == b.lowercaseString {
//Strings match
}
ПРАВИЛЬНИЙ ШЛЯХ:
let a: String = "Cash"
let b: String = "cash"
if a.caseInsensitiveCompare(b) == .orderedSame {
//Strings match
}
Зверніть увагу: ComparisonResult.orderedSame також може бути записаний як .orderedSame скорочено.
ІНШІ СПОСОБИ:
a.
if a.lowercased() == b.lowercased() {
//Strings match
}
b.
if a.uppercased() == b.uppercased() {
//Strings match
}
c.
if a.capitalized() == b.capitalized() {
//Strings match
}
Можна просто прокрутити своє:
func equalIgnoringCase(a:String, b:String) -> Bool {
return a.lowercaseString == b.lowercaseString
}
localizedCaseInsensitiveContains : Повертає, чи містить одержувач заданий рядок, виконуючи нечутливий до регістру пошук з урахуванням локалі
if a.localizedCaseInsensitiveContains(b) {
//returns true if a contains b (case insensitive)
}
Відредаговано :
caseInsensitiveCompare : Повертає результат виклику порівняння (_: options :) з NSCaseInsensitiveSearch як єдиним варіантом.
if a.caseInsensitiveCompare(b) == .orderedSame {
//returns true if a equals b (case insensitive)
}
Ви також можете зробити всі літери великими (або малими) і перевірити, чи однакові вони.
var a = “Cash”
var b = “CASh”
if a.uppercaseString == b.uppercaseString{
//DO SOMETHING
}
Це зробить обидві змінні як ”CASH”
і, отже, вони рівні.
Ви також можете зробити String
розширення
extension String{
func equalsIgnoreCase(string:String) -> Bool{
return self.uppercaseString == string.uppercaseString
}
}
if "Something ELSE".equalsIgnoreCase("something Else"){
print("TRUE")
}
Swift 4, я пішов шляхом розширення String, використовуючи caseInsensitiveCompare () як шаблон (але дозволяючи операнду бути необов’язковим). Ось ігровий майданчик, який я використовував для його складання (нове для Свіфта, тому відгуки більш ніж вітаються).
import UIKit
extension String {
func caseInsensitiveEquals<T>(_ otherString: T?) -> Bool where T : StringProtocol {
guard let otherString = otherString else {
return false
}
return self.caseInsensitiveCompare(otherString) == ComparisonResult.orderedSame
}
}
"string 1".caseInsensitiveEquals("string 2") // false
"thingy".caseInsensitiveEquals("thingy") // true
let nilString1: String? = nil
"woohoo".caseInsensitiveEquals(nilString1) // false
.orderedSame
а не ComparisonResult.orderedSame
.
Ви можете просто написати своє Розширення рядка для порівняння лише за кілька рядків коду
extension String {
func compare(_ with : String)->Bool{
return self.caseInsensitiveCompare(with) == .orderedSame
}
}
Стрімкий 3
if a.lowercased() == b.lowercased() {
}
Свіфт 3 : Ви можете визначити власного оператора, наприклад ~=
.
infix operator ~=
func ~=(lhs: String, rhs: String) -> Bool {
return lhs.caseInsensitiveCompare(rhs) == .orderedSame
}
Які потім можна спробувати на дитячому майданчику
let low = "hej"
let up = "Hej"
func test() {
if low ~= up {
print("same")
} else {
print("not same")
}
}
test() // prints 'same'
String
екземпляри між собою (або іншими String
літералами). Уявіть let str = "isCAMELcase"
бути переключено, з футляром наступним чином : case "IsCamelCase": ...
. За допомогою методу, наведеного вище, це case
буде введено успішно, що не очікується, що походить від стандартної реалізації бібліотек, що String
відповідає шаблону. Оновлена відповідь Swift 3 все ще хороша, але ...
String
розширення) як помічника вище, ніж замінювати відповідність String
шаблону за замовчуванням .
extension String
{
func equalIgnoreCase(_ compare:String) -> Bool
{
return self.uppercased() == compare.uppercased()
}
}
зразок використання
print("lala".equalIgnoreCase("LALA"))
print("l4la".equalIgnoreCase("LALA"))
print("laLa".equalIgnoreCase("LALA"))
print("LALa".equalIgnoreCase("LALA"))
Свіфт 3:
Ви також можете використовувати локалізоване нечутливе до регістру порівняння між двома рядками функції, і вона повертається Bool
var a = "cash"
var b = "Cash"
if a.localizedCaseInsensitiveContains(b) {
print("Identical")
} else {
print("Non Identical")
}