@rckoenes Я новичок в Swift, я знаю, как это сделать
Rajneesh071
1
Тогда почему бы вам не начать игровую площадку и не попробовать ее?
Rckoenes
Если вы все еще здесь, пожалуйста, измените принятый ответ на user1021430 ... это правильно
Дэн Розенстарк
Ответы:
1045
Вы можете сделать точно такой же вызов с Swift:
Свифт 4 и Свифт 5
В 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
Сноски
Просто помните, что использование функций сбора в строках имеет некоторые крайние случаи, которые могут дать вам неожиданные результаты, например, при работе с эмодзи или другими кластерами графем, такими как буквы с акцентом.
Документация Apple гласит: An NSRange structure giving the location and length in the receiver of the first occurrence of aString. Returns {NSNotFound, 0} if aString is not found or is empty (@"").Так что, может быть, просто проверка nilне будет работать должным образом.
Алекс
7
string.lowercaseString.rangeOfString ("swift"). location! = NSNotFound. Пожалуйста, прочитайте документацию .. Вы не получите нулевой объект обратно.
TheCodingArt
4
@TheGamingArt Да, вы будете. Свифт автоматически совершает все обходы, так что если NSRange это, {NSNotFound, 0}он представляется для вас как ноль. Если это фактический диапазон, он представляется вам как Swift Range (необязательно). Круто.
Мэтт
4
Grr. containsString не находится в документах, даже с Xcode 6.3.1.
Дункан С
19
@TheGoonie: Это не называет NSString«S .rangeOfString(). Это называет String's' .rangeOfString(), который объявлен какfunc rangeOfString(aString: String, options mask: NSStringCompareOptions = default, range searchRange: Range<Index>? = default, locale: NSLocale? = default) -> Range<Index>?
Больше не нужно, если у вас нет Foundationвокруг ... containsStringработает нормально.
Дэн Розенстарк
5
для быстрой 3.0. Перейдите к следующему: расширение String {func содержит (find: String) -> Bool {return self.range (of: find)! = Nil} func содержитIgnoringCase (find: String) -> Bool {return self.range (of: find , параметры: .caseInsensitive)! = nil}}
Майкл Шан
Для Swift 4 -> расширение String {func содержит (find: String) -> Bool {return self.range (of: find)! = Nil} func содержитIgnoringCase (find: String) -> Bool {return self.range (of: найти, параметры: .caseInsensitive)! = nil}}
shokaveli
50
Из документации кажется, что вызов containsString()строки должен работать:
Тип String Swift напрямую связан с классом Foundation NSString. Если вы работаете с платформой Foundation в Cocoa или Cocoa Touch, весь API NSString доступен для вызова любого значения String, которое вы создаете, в дополнение к функциям 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"ifNSString(string: string).containsString("Swift"){
println("YES")}
И, наконец, вы можете привести существующего Stringк NSStringкак показано ниже
var string ="hello Swift"if(string asNSString).containsString("Swift"){
println("YES")}
Последний пример (я не пробовал другие) вылетает для меня на iOS 7 (устройство); Приложения Swift должны нормально работать на iOS 7. Я получаю ошибку [__NSCFString containsString:]: unrecognized selector sent to instance. Кроме того, я не могу найти метод containsStringв документации разработчика, чтобы подтвердить, является ли он новым для iOS 8.
Джейсон Лич
Интересно. Я проверял это только на детской площадке. Я попробую позже, когда буду на своем компьютере.
Цезарь
третий и четвертый варианты - единственные, которые разрешены компилятором. оба вылетели для меня в бета-версии 4 в iOS 7.
Palmi
38
Другой. Поддерживает регистр и диакритические опции.
вам нужно import Foundation, иначе это не сработает.
Андрей Черненко
Требуется любой import UIKitиз import Foundationних, по крайней мере, с iOS 11 и Swift 4.
Мюррей Сагал
Но это с учетом регистра. Как вы делаете сравнение при игнорировании дела. Как в Java String.equalsIgnoreCase (anotherString)?
zulkarnain шах
@zulkarnainshah Я добавил пример к ответу.
Мюррей Сагал
@MurraySagal Это все еще не регистронезный поиск. Вы конвертируете исходную строку в строчные, а затем явно сравниваете ее со строчными. Это сделает работу, но это не идеальный способ сделать это
zulkarnain shah
22
В Swift 4.2
использование
func contains(_ str:String)->Bool
пример
let string ="hello Swift"let containsSwift = string.contains("Swift")
print(containsSwift)// prints true
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
Следующий шаг: Сделайте это универсальной функцией, которая работает со всеми коллекциями :-) Например, проверьте встроенную функцию StartWith (). В варианте «игнорировать регистр» строчные строки нужно вводить только один раз (пусть lc = other.lowercaseString перед do)
hnh
9
Из всех ответов здесь, я думаю, что они либо не работают, либо немного взломаны (возвращаясь к NSString). Весьма вероятно, что правильный ответ на этот вопрос изменился в разных бета-версиях.
Вот что я использую:
let string:String="hello Swift"if string.rangeOfString("Swift")!=nil{
println("exists")}
Иногда вам может понадобиться компактная форма следующим образом: let rangeIfExists = string.rangeOfString ("Swift") ?? false, который либо возвращает false как логическое значение, если оно не содержится, либо NSRange в противном случае
Стефан де Лука
5
Вам не нужно писать какой-либо специальный код для этого. Начиная с версии 1.2 в Swift уже есть все необходимые методы:
Длина строки: count(string);
проверки , если строка содержит подстроку: contains(string, substring);
проверка, начинается ли строка с подстроки: startsWith(string, substring)
importUIKitlet 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
string.containsString доступен только в 10.10 Yosemite (и, вероятно, iOS8). Также соединение с ObjectiveC дает сбой в 10.9. Вы пытаетесь передать NSString в NSCFString. Я не знаю разницы, но я могу сказать 10.9 barfs, когда он выполняет этот код в приложении OS X 10.9.
Диапазон String выше отлично работает на 10,9. Я считаю, что разработка на 10.9 супер стабильна с Xcode beta2. Я не использую игровые площадки или игровую версию командной строки. Я нахожу, что если импортированы правильные рамки, автозаполнение очень полезно.
let string ="hello Swift"iflet range = string.range(of:"Swift"){
print("exists at range \(range)")}else{
print("does not exist")}iflet lowercaseRange = string.lowercased().range(of:"swift"){
print("exists at range \(lowercaseRange)")}else{
print("does not exist")}
Swift 4 способа проверить наличие подстрок, включая необходимый Foundation(или UIKit) каркас импорта:
importFoundation// 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)метод.
// Search string exist in employee name finding.
var empName:NSString!= employeeDetails[filterKeyString]asNSStringCase 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.
}
Свифт 3: Здесь вы можете увидеть мое умное расширение для поиска строки, которое позволяет вам выполнять поиск по строке, чтобы узнать, содержит ли она, или, возможно, отфильтровать коллекцию на основе текста поиска.
Какая? похоже, его нет в наличии? в версии, которая поставляется с xcode 6.1
Ali
0
Я нашел пару интересных вариантов использования. Эти варианты используют метод 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). Это позволяет проверить состояние в любое время.
Вариант этого происходит, когда иногда мне нужно проанализировать отсутствующее свойство для этого объекта. Поиск строки позволяет мне найти конкретную подстроку, которая имеет значение nil (по умолчанию при создании объекта).
StringТип Swift легко связан с NSString
классом Foundation . Если вы работаете с платформой Foundation в Cocoa или Cocoa Touch, весь NSStringAPI доступен для вызова любого
Stringзначения, которое вы создаете, в дополнение к функциям String, описанным в этой главе. Вы также можете использовать значение String с любым API, для которого требуется экземпляр NSString.
Вам необходимо import Foundationсвязать NSStringметоды и сделать их доступными для класса Swift String.
Ага. Пробовал на игровой площадке, в приложении Mac и в приложении iOS. Также пробовал в Playground импортировать Какао, UIKit, Foundation и все возможные комбинации трех из них (кроме Какао / UIKit, что не имеет смысла)
Чем это отличается от некоторых других ответов здесь?
Эшли Миллс
1
$ swift Welcome to Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1). Type :help for assistance. 1> print ("Ping") Ping 2> Print ("Ping") error: repl.swift:2:1: error: use of unresolved identifier 'Print' Print ("Ping") ^~~~~ Предоставляя непроверенный ответ, который не работает. Печать! = Печать.
Ответы:
Вы можете сделать точно такой же вызов с Swift:
Свифт 4 и Свифт 5
В Swift 4 String представляет собой набор
Character
значений, в Swift 2 и 3 это было не так, поэтому вы можете использовать этот более краткий код 1 :Swift 3.0+
Олд Свифт
Я надеюсь, что это полезное решение, так как некоторые люди, включая меня, столкнулись с некоторыми странными проблемами при звонке
containsString()
. 1PS. Не забудь
import Foundation
Сноски
источник
An NSRange structure giving the location and length in the receiver of the first occurrence of aString. Returns {NSNotFound, 0} if aString is not found or is empty (@"").
Так что, может быть, просто проверкаnil
не будет работать должным образом.{NSNotFound, 0}
он представляется для вас как ноль. Если это фактический диапазон, он представляется вам как Swift Range (необязательно). Круто.NSString
«S.rangeOfString()
. Это называетString
's'.rangeOfString()
, который объявлен какfunc rangeOfString(aString: String, options mask: NSStringCompareOptions = default, range searchRange: Range<Index>? = default, locale: NSLocale? = default) -> Range<Index>?
Способ расширения
Swift 4
Как правило, Swift 4 содержит метод, однако он доступен из iOS 8.0+
Swift 3.1
Вы можете написать расширение
contains:
иcontainsIgnoringCase
дляString
Старая версия Swift
Пример:
источник
Foundation
вокруг ...containsString
работает нормально.Из документации кажется, что вызов
containsString()
строки должен работать:Однако, похоже, это не работает.
Если вы попытаетесь использовать
someString.containsString(anotherString)
, вы получите ошибку времени компиляции, которая гласит'String' does not contain a member named 'containsString'
.Итак, у вас осталось несколько вариантов, один из которых - явно привязать ваш
String
к Objective-C с помощьюbridgeToObjectiveC()
двух других, включая явное использование,NSString
и последний - приведениеString
кNSString
Соединяя мост, вы получите:
Явно введя строку как
NSString
, вы получите:Если у вас есть существующий
String
, вы можете инициализировать NSString из него, используя NSString (string :):И, наконец, вы можете привести существующего
String
кNSString
как показано нижеисточник
[__NSCFString containsString:]: unrecognized selector sent to instance
. Кроме того, я не могу найти методcontainsString
в документации разработчика, чтобы подтвердить, является ли он новым для iOS 8.Другой. Поддерживает регистр и диакритические опции.
Swift 3.0
Применение
iOS 9+
Функция, нечувствительная к регистру и диакритическим знакам, доступна с iOS 9.
источник
Начиная с Xcode 7.1 и Swift 2.1
containsString()
у меня нормально работает.Свифт 4:
И пример Swift 4 без учета регистра:
Или используя
String
расширение без учета регистра :источник
import Foundation
, иначе это не сработает.import UIKit
изimport Foundation
них, по крайней мере, с iOS 11 и Swift 4.В Swift 4.2
использование
пример
источник
> В SWIFT 3.0
Вывод
источник
Вы можете сделать это очень легко в Swift, используя код:
источник
Просто добавление к ответам здесь.
Вы также можете выполнить локальный тест без учета регистра, используя:
Пример:
ОБНОВИТЬ
Это часть Foundation Framework для iOS и Mac OS X 10.10.x и была частью 10.10 во время моей первоначальной публикации.
источник
Вот мой первый удар в этом на быстрой площадке. Я расширяю String, предоставляя две новые функции (contains и containsIgnoreCase)
Используйте это так
Буду рад любым отзывам :)
источник
Из всех ответов здесь, я думаю, что они либо не работают, либо немного взломаны (возвращаясь к NSString). Весьма вероятно, что правильный ответ на этот вопрос изменился в разных бета-версиях.
Вот что я использую:
"! = Nil" стал обязательным в бета-версии 5.
источник
Вот ты где:
источник
Вам не нужно писать какой-либо специальный код для этого. Начиная с версии 1.2 в Swift уже есть все необходимые методы:
count(string)
;contains(string, substring)
;startsWith(string, substring)
источник
В Свифт 3
источник
Ну вот! Готов к Xcode 8 и Swift 3.
источник
string.containsString доступен только в 10.10 Yosemite (и, вероятно, iOS8). Также соединение с ObjectiveC дает сбой в 10.9. Вы пытаетесь передать NSString в NSCFString. Я не знаю разницы, но я могу сказать 10.9 barfs, когда он выполняет этот код в приложении OS X 10.9.
Вот различия в Swift с 10.9 и 10.10: https://developer.apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/index.html containsString доступен только в 10.10
Диапазон String выше отлично работает на 10,9. Я считаю, что разработка на 10.9 супер стабильна с Xcode beta2. Я не использую игровые площадки или игровую версию командной строки. Я нахожу, что если импортированы правильные рамки, автозаполнение очень полезно.
источник
С новым синтаксисом в Swift 4 вы можете просто
string.contains("Swift 4 is the best")
строка ваша строковая переменная
источник
Версия Xcode 8 / Swift 3:
Вы также можете использовать
contains
:источник
Проверьте, содержит ли он «Привет»
источник
Swift 4 способа проверить наличие подстрок, включая необходимый
Foundation
(илиUIKit
) каркас импорта:Если
Foundation
(илиUIKit
) фреймворк не импортирован,str.contains("Can")
выдаст ошибку компилятора.Этот ответ является регургитирующим ответом manojlds , который является полностью правильным. Я понятия не имею , почему так много ответов пройти через столько хлопот , чтобы воссоздать
Foundation
«sString.contains(subString: String)
метод.источник
источник
Свифт 3: Здесь вы можете увидеть мое умное расширение для поиска строки, которое позволяет вам выполнять поиск по строке, чтобы узнать, содержит ли она, или, возможно, отфильтровать коллекцию на основе текста поиска.
https://github.com/magonicolas/Swift-Smart-String-Search
источник
В iOS 8 и новее вы можете использовать эти два
NSString
метода:источник
Я нашел пару интересных вариантов использования. Эти варианты используют метод rangeOfString, и я включаю пример равенства, чтобы показать, как лучше всего использовать функции поиска и сравнения строк в Swift 2.0.
источник
Если вы хотите проверить, что одна строка содержит в себе другую подстроку или нет, вы также можете проверить это так,
Теперь, в этой конкретной строке, если вы хотите знать, содержит ли она фруктовое название «яблоко» или нет, вы можете сделать,
Надеюсь, что это работает для вас.
источник
Вы можете просто сделать то, что вы упомянули:
Из документов:
Вам необходимо
import Foundation
связатьNSString
методы и сделать их доступными для класса Swift String.источник
SWIFT 4 - это очень просто!
источник
$ swift Welcome to Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1). Type :help for assistance. 1> print ("Ping") Ping 2> Print ("Ping") error: repl.swift:2:1: error: use of unresolved identifier 'Print' Print ("Ping") ^~~~~
Предоставляя непроверенный ответ, который не работает. Печать! = Печать.