it-roy-ru.com

Как проверить, содержит ли строка другую строку в Swift?

В Objective-C код для проверки подстроки в NSString

NSString *string = @"hello Swift";
NSRange textRange =[string rangeOfString:@"Swift"];
if(textRange.location != NSNotFound)
{
    NSLog(@"exists");
}

Но как мне сделать это в Swift?

450
Rajneesh071

Вы можете сделать точно такой же вызов с Swift:

Swift 4

В Swift 4 String представляет собой набор значений Character, в Swift 2 и 3 такого не было, поэтому вы можете использовать этот более лаконичный код1:

let string = "hello Swift"
if string.contains("Swift") {
    print("exists")
}

Swift 3.0+

var string = "hello Swift"

if string.range(of:"Swift") != nil { 
    print("exists")
}

// alternative: not case sensitive
if string.lowercased().range(of:"Swift") != nil {
    print("exists")
}

Олд Свифт

var string = "hello Swift"

if string.rangeOfString("Swift") != nil{ 
    println("exists")
}

// alternative: not case sensitive
if string.lowercaseString.rangeOfString("Swift") != nil {
    println("exists")
}

Я надеюсь, что это полезное решение, так как некоторые люди, включая меня, столкнулись с некоторыми странными проблемами, вызвав containsString().1

PS. Не забудьте import Foundation

Сноски

  1. Просто помните, что использование функций сбора в Strings имеет некоторые крайние случаи , которые могут дать вам неожиданные результаты, e. г. когда имеешь дело с эмодзи или другими кластерами графем, такими как буквы с акцентом.
872
Jens Wirth

Способ расширения

Swift 4

extension String {
    func contains(find: String) -> Bool{
        return self.range(of: find) != nil
    }
    func containsIgnoringCase(find: String) -> Bool{
        return self.range(of: find, options: .caseInsensitive) != nil
    }
}

var value = "Hello world"

print(value.contains("Hello")) // true
print(value.contains("bo"))    // false

print(value.containsIgnoringCase(find: "hello"))    // true
print(value.containsIgnoringCase(find: "Hello"))    // true
print(value.containsIgnoringCase(find: "bo"))       // false

Обычно Swift 4 имеет содержит метод, но доступен из iOS 8.0+


Swift 3.1

Вы можете написать расширение contains: и containsIgnoringCase для String

extension String { 

   func contains(_ find: String) -> Bool{
     return self.range(of: find) != nil
   }

   func containsIgnoringCase(_ find: String) -> Bool{
     return self.range(of: find, options: .caseInsensitive) != nil 
   }
 }

Старая версия Swift

extension String {

    func contains(find: String) -> Bool{
       return self.rangeOfString(find) != nil
     }

    func containsIgnoringCase(find: String) -> Bool{
       return self.rangeOfString(find, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil
     }
}

Пример:

var value = "Hello world"

print(value.contains("Hello")) // true
print(value.contains("bo"))    // false

print(value.containsIgnoringCase("hello"))    // true
print(value.containsIgnoringCase("Hello"))    // true
print(value.containsIgnoringCase("bo"))       // false
182
Maxim Shoustin

Из документации кажется, что вызов containsString() для String должен работать:

Тип String Swift легко соединяется с NSString Фонда учебный класс. Если вы работаете с платформой Foundation в Какао или Cocoa Touch, весь NSString API доступен для вызова на любом Строковое значение, которое вы создаете, в дополнение к описанным функциям String в этой главе. Вы также можете использовать значение String с любым API, который требуется экземпляр NSString.

Тем не менее, похоже, что это не работает.

Если вы попытаетесь использовать someString.containsString(anotherString), вы получите сообщение об ошибке компиляции, в котором говорится 'String' does not contain a member named 'containsString'.

Таким образом, у вас остается несколько вариантов, один из которых заключается в том, чтобы явно связать вашу String с Objective-C с помощью bridgeToObjectiveC(), остальные два связаны с явным использованием NSString, а последний включает приведение String к NSString

Соединяя мост, вы получите:

var string = "hello Swift"
if string.bridgeToObjectiveC().containsString("Swift") {
    println("YES")
}

Явно введя строку как NSString, вы получите:

var string: NSString = "hello Swift"
if string.containsString("Swift") {
    println("YES")
}

Если у вас есть существующая переменная String, вы можете инициализировать NSString из нее, используя NSString (string :):

var string = "hello Swift"
if NSString(string: string).containsString("Swift") {
    println("YES")
}

И, наконец, вы можете привести существующую String к NSString, как показано ниже

var string = "hello Swift"
if (string as NSString).containsString("Swift") {
    println("YES")
}
49
Cezar

Другой. Поддерживает регистр и диакритические опции.

Swift 3.0

struct MyString {
  static func contains(_ text: String, substring: String,
                       ignoreCase: Bool = true,
                       ignoreDiacritic: Bool = true) -> Bool {

    var options = NSString.CompareOptions()

    if ignoreCase { _ = options.insert(NSString.CompareOptions.caseInsensitive) }
    if ignoreDiacritic { _ = options.insert(NSString.CompareOptions.diacriticInsensitive) }

    return text.range(of: substring, options: options) != nil
  }
}

Использование

MyString.contains("Niels Bohr", substring: "Bohr") // true

iOS 9+

Функция, чувствительная к регистру и диакритическим знакам, доступна с iOS 9.

if #available(iOS 9.0, *) {
  "Für Elise".localizedStandardContains("fur") // true
}
36
Evgenii

Начиная с Xcode 7.1 и Swift 2.1 containsString() работает нормально для меня.

let string = "hello Swift"
if string.containsString("Swift") {
    print("found Swift")
}

Свифт 4: 

let string = "hello Swift"
if string.contains("Swift") {
    print("found Swift")
}

И пример Swift 4 без учета регистра: 

let string = "Hello Swift"
if string.lowercased().contains("Swift") {
    print("found Swift")
}

Или используя расширение String без учета регистра:

extension String {
    func containsIgnoreCase(_ string: String) -> Bool {
        return self.lowercased().contains(string.lowercased())
    }
}

let string = "Hello Swift"
let stringToFind = "Swift"
if string.containsIgnoreCase(stringToFind) {
    print("found: \(stringToFind)")  // found: Swift
}
print("string: \(string)")
print("stringToFind: \(stringToFind)")

// console output:
found: Swift
string: Hello Swift
stringToFind: Swift
31
Murray Sagal

В Swift 4.2

Использование

func contains(_ str: String) -> Bool

Пример

let string = "hello Swift"
let containsSwift = string.contains("Swift")
print(containsSwift) // prints true
22
Saranjith

> В Swift 3.0

let str = "Hello Swift"
if str.lowercased().contains("Swift".lowercased()) {
    print("String Contains Another String")
} else {
    print("Not Exists")
}

Выход

String Contains Another String
16
Ashok R

Вы можете сделать это очень легко в Swift, используя код:

let string = "hello Swift";
let subString = (string as NSString).containsString("Swift")
if(subString){println("Exist")}
15
Anmol Kukreja

Из всех ответов здесь, я думаю, что они либо не работают, либо немного взломаны (возвращаясь к NSString). Весьма вероятно, что правильный ответ на этот вопрос изменился в разных бета-версиях.

Вот что я использую:

let string: String = "hello Swift"
if string.rangeOfString("Swift") != nil
{
    println("exists")
}

"! = Nil" стал обязательным в бета-версии 5.

9
user1021430

Просто добавление к ответам здесь.

Вы также можете выполнить локальный тест без учета регистра, используя: 

 - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString

Пример:

    import Foundation

    var string: NSString  =  "hello Swift"
   if string.localizedCaseInsensitiveContainsString("Hello") {
    println("TRUE")
}

ОБНОВЛЕНИЕ

Это часть Foundation Framework для iOS & Mac OS X 10.10.x и был частью 10.10 во время моей первоначальной публикации.

Создан документ: 2014-06-05 12:26:27 -0700 Замечания к выпуску OS X Copyright © 2014 Apple Inc. Все права защищены.

Замечания к выпуску OS X 10.10 Cocoa Foundation Framework

NSString теперь имеет следующие два вспомогательных метода:

- (BOOL)containsString:(NSString *)str;

- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str; 

9
markhunte

Вот мой первый удар по этому вопросу на игровой площадке Swift .. Я расширяю String, предоставляя две новые функции (contains и containsIgnoreCase)

extension String {
    func contains(other: String) -> Bool{
        var start = startIndex

        do{
            var subString = self[Range(start: start++, end: endIndex)]
            if subString.hasPrefix(other){
                return true
            }

        }while start != endIndex

        return false
    }

    func containsIgnoreCase(other: String) -> Bool{
        var start = startIndex

        do{
            var subString = self[Range(start: start++, end: endIndex)].lowercaseString
            if subString.hasPrefix(other.lowercaseString){
                return true
            }

        }while start != endIndex

        return false
    }
}

Используйте это так

var sentence = "This is a test sentence"
sentence.contains("this")  //returns false
sentence.contains("This")  //returns true
sentence.containsIgnoreCase("this")  //returns true

"This is another test sentence".contains(" test ")    //returns true

Буду рад любым отзывам :)

8
Ken

Вот ты где:

let s = "hello Swift"
if let textRange = s.rangeOfString("Swift") {
    NSLog("exists")
}
6
Stéphane de Luca

В Свифт 3

if((a.range(of: b!, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil)) != nil){
    print("Done")
}
5
Marie Amida

Вам не нужно писать какой-либо специальный код для этого. Начиная с версии 1.2 в Swift уже есть все необходимые методы:

  • получение длины строки: count(string);
  • проверка, содержит ли строка подстроку: contains(string, substring);
  • проверка, начинается ли строка с подстроки: startsWith(string, substring)
  • и так далее.
5
Max Ivashkevich

Ну вот! Готов к Xcode 8 и Swift 3.

import UIKit

let mString = "This is a String that contains something to search."
let stringToSearchUpperCase = "String"
let stringToSearchLowerCase = "string"

mString.contains(stringToSearchUpperCase) //true
mString.contains(stringToSearchLowerCase) //false
mString.lowercased().contains(stringToSearchUpperCase) //false
mString.lowercased().contains(stringToSearchLowerCase) //true
4
Carlitos

string.containsString доступен только в 10.10 Yosemite (и, вероятно, iOS8) ... Вы пытаетесь передать NSString в NSCFString. Я не знаю разницы, но я могу сказать 10,9 барф, когда он выполняет этот код в приложении OS X 10.9. 

Вот различия в Swift с 10.9 и 10.10: https://developer.Apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/index.html onlyString is only доступно в 10.10

Диапазон String выше отлично работает на 10,9. Я считаю, что разработка на 10.9 супер стабильна с Xcode beta2. Я не использую игровые площадки или игровую версию командной строки. Я нахожу, что если импортированы правильные рамки, автозаполнение очень полезно.

3
Goodtime

Проверьте, содержит ли он «Привет»

let s = "Hello World"

if s.rangeOfString("Hello") != nil {
    print("Yes it contains 'Hello'")
}
2
user7615773

Swift 4 способ проверки подстрок, включая необходимый Foundation (или UIKit) импорт структуры: 

import Foundation // or UIKit

let str = "Oh Canada!"

str.contains("Can") // returns true

str.contains("can") // returns false

str.lowercased().contains("can") // case-insensitive, returns true

Если структура Foundation (или UIKit) не импортирована, str.contains("Can") выдаст ошибку компилятора.


Этот ответ является регургитирующим ответом manojlds , что совершенно правильно. Я понятия не имею, почему столько ответов проходит через столько проблем, чтобы воссоздать метод Foundation's String.contains(subString: String).

2
NonCreature0714

Версия Xcode 8/Swift 3:

let string = "hello Swift"

if let range = string.range(of: "Swift") {
    print("exists at range \(range)")
} else {
    print("does not exist")
}

if let lowercaseRange = string.lowercased().range(of: "Swift") {
    print("exists at range \(lowercaseRange)")
} else {
    print("does not exist")
}

Вы также можете использовать contains:

string.contains("Swift") // false
string.contains("Swift") // true
2
JAL

С новым синтаксисом в Swift 4 вы можете просто

string.contains("Swift 4 is the best")

строка ваша строковая переменная

1
100tomer
// Search string exist in employee name finding.
var empName:NSString! = employeeDetails[filterKeyString] as NSString

Case sensitve search.
let rangeOfSearchString:NSRange! = empName.rangeOfString(searchString, options: NSStringCompareOptions.CaseInsensitiveSearch)

// Not found.
if rangeOfSearchString.location != Foundation.NSNotFound
{
    // search string not found in employee name.
}
// Found
else
{
    // search string found in employee name.
}
1
abhi

Если вы хотите проверить, что одна строка содержит в себе другую подстроку или нет, вы можете проверить это так же,

var name = String()  
name = "John has two apples." 

Теперь, в этой конкретной строке, если вы хотите знать, содержит ли она фруктовое название «Apple» или нет, вы можете сделать,

if name.contains("Apple")      
{  
print("Yes , it contains fruit name")    
}    
else      
{    
 print(it does not contain any fruit name)    
}    

Надеюсь, что это работает для вас.

0
Varsha Shivhare

Я нашел пару интересных вариантов использования. Эти варианты используют метод rangeOfString, и я включаю пример равенства, чтобы показать, как лучше всего использовать функции поиска и сравнения строк в Swift 2.0

//In viewDidLoad() I assign the current object description (A Swift String) to self.loadedObjectDescription
self.loadedObjectDescription = self.myObject!.description

Позже, после внесения изменений в self.myObject, я могу обратиться к следующие процедуры сравнения строк (установка в качестве ленивых переменных, которые возвращают Bool). Это позволяет проверить состояние в любое время.

lazy var objectHasChanges : Bool = {
        guard self.myObject != nil else { return false }
        return !(self.loadedObjectDescription == self.myObject!.description)
    }()

Вариант этого случается, когда иногда мне нужно проанализировать недостающее собственность на этот объект. Поиск строки позволяет мне найти конкретная подстрока устанавливается в ноль (по умолчанию при создании объекта).

    lazy var isMissingProperty : Bool = {
        guard self.myObject != nil else { return true }
        let emptyPropertyValue = "myProperty = nil"
        return (self.myObject!.description.rangeOfString(emptyPropertyValue) != nil) ? true : false
    }()
0
Tommie C.

Swift 3: Здесь вы можете увидеть мое умное расширение для поиска строки, которое позволяет вам выполнить поиск по строке, чтобы увидеть, содержит ли она, или, возможно, отфильтровать коллекцию на основе текста поиска.

https://github.com/magonicolas/Swift-Smart-String-Search

0
Mago Nicolas Palacios

В iOS 8 и новее вы можете использовать эти два метода NSString:

@availability(iOS, introduced=8.0)
func containsString(aString: String) -> Bool

@availability(iOS, introduced=8.0)
func localizedCaseInsensitiveContainsString(aString: String) -> Bool
0
Rudolf Adamkovič