Как в Swift сравнить две строки? Аналог isEqualToString из Objective-C
Используйте оператор == для сравнения строк в Swift
Да, ваш код абсолютно корректен! В Swift оператор == для строк работает именно как isEqualToString: в Objective-C — он сравнивает содержимое строк, а не их указатели. Это одно из ключевых отличий Swift от Objective-C, где == для объектов NSString сравнивает ссылки.
В Swift строки — это структуры (struct), а не классы, поэтому оператор == по умолчанию сравнивает их значения. Более того, Swift использует протокол Equatable, который гарантирует корректное сравнение.
Примеры сравнения строк
let string1 = "Hello, World!"
let string2 = "Hello, World!"
let string3 = "hello, world!"
// Сравнение с учётом регистра
if string1 == string2 {
print("Строки идентичны") // Выведется
}
if string1 == string3 {
print("Строки идентичны") // Не выведется — разный регистр
} else {
print("Строки различаются из-за регистра")
}
// Сравнение без учёта регистра
if string1.lowercased() == string3.lowercased() {
print("Строки равны без учёта регистра") // Выведется
}
Альтернативы: метод NSString.compare и другие
Хотя == — это основной способ, Swift также предоставляет более гибкие методы для сравнения строк:
hasPrefix(_:)— проверяет, начинается ли строка с указанного префикса.hasSuffix(_:)— проверяет, заканчивается ли строка указанным суффиксом.localizedCaseInsensitiveCompare(_:)— сравнение с учётом локали и без учёта регистра (возвращаетComparisonResult).localizedStandardCompare(_:)— сравнение, как в Finder (например, естественная сортировка чисел).
Пример использования localizedCaseInsensitiveCompare:
let result = string1.localizedCaseInsensitiveCompare(string3)
if result == .orderedSame {
print("Строки равны без учёта регистра и с учётом локали")
}
Важные замечания
- Unicode и составные символы: Swift корректно обрабатывает Unicode. Например,
"é"(один символ) и"e\u{301}"(e + accent) считаются равными при сравнении через==, так как Swift нормализует строки. - Производительность:
==для строк очень эффективен, так как Swift использует copy-on-write и внутренние оптимизации. - Nil-безопасность: В Swift строки не могут быть
nil(если только это не опциональный типString?). Если вы работаете с опционалами, используйте==или optional binding:
let optionalString: String? = "Hello"
if optionalString == "Hello" {
print("Опциональная строка равна 'Hello'")
}
Таким образом, ваш код с == — это правильный и идиоматичный способ сравнения строк в Swift. Забудьте про isEqualToString — в Swift всё проще и безопаснее!
Если вам нужен полный контроль: метод NSString.isEqual(to:)
Хотя оператор == — это предпочтительный способ, вы всё ещё можете использовать метод из Objective-C, если работаете с NSString (например, при взаимодействии с Objective-C кодом). Swift автоматически мостит String к NSString, поэтому вы можете вызвать:
let str1 = "Hello"
let str2 = "Hello"
if str1.isEqual(to: str2) {
print("Строки равны (метод NSString)")
}
Это прямой аналог isEqualToString:, и он работает точно так же. Однако в чистом Swift-коде лучше использовать == — он короче, читаемее и не требует импорта Foundation (хотя Foundation обычно подключается автоматически в проектах iOS/macOS).
Когда может пригодиться этот метод?
- Если вы пишете универсальный код, который работает и с
String, и сNSString. - Если вам нужно явно указать, что вы сравниваете именно строки (например, в обобщённых функциях).
- Для обратной совместимости с Objective-C кодом.
Но в 99% случаев используйте == — это современный, безопасный и быстрый способ сравнения строк в Swift.