如何检查一个string是否包含Swift中的另一个string?

Objective-C中,检查NSString的子string的代码是:

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

但是我如何在Swift中做到这一点?

你可以用Swift完成相同的调用:

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") } 

我希望这是一个有用的解决scheme,因为包括我在内的一些人通过调用containsString()遇到一些奇怪的问题。

PS。 不要忘记import Foundation

扩展方式

斯威夫特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:containsIgnoringCaseString

 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 

从文档看来,调用一个stringcontainsString()应该工作:

Swift的Stringtypes无缝桥接到Foundation的NSString类。 如果您正在使用Cocoa或Cocoa Touch中的Foundation框架,则除了本章中介绍的stringfunction之外,还可以使用整个NSString API调用您创build的任何string值。 您也可以使用任何需要NSString实例的API来使用String值。

但是,这似乎并没有这样工作。

如果你尝试使用someString.containsString(anotherString) ,你会得到一个编译时错误,指出'String' does not contain a member named 'containsString'

所以,你只剩下几个选项,其中一个是通过使用bridgeToObjectiveC()明确地将你的String桥接到Objective-C,另外两个涉及明确地使用NSString ,最后一个涉及将String强制转换为NSString

通过桥接,你会得到:

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

通过显式inputstring作为NSString ,你会得到:

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

如果你有一个现有的String ,你可以通过使用NSString(string :)来初始化一个NSString:

 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") } 

另一个。 支持大小写和变音符号选项。

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 } 

从Xcode 7.1和Swift 2.1中, containsString()对我来说工作正常。

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

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 

你可以在Swift中使用代码很容易地做到这一点:

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

>在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 

在Swift 4.0中

使用

 func contains(_ str: String) -> Bool 

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

在这里的所有答案,我认为他们要么不工作,要么是一个黑客(铸造回NSString)。 对于这个问题的正确答案很可能随着不同的testing版发生了变化。

这是我使用的:

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

Beta 5版本需要“!= nil”。

这是我第一次在快速的操场上刺伤了这个。 我通过提供两个新的函数(contains和containsIgnoreCase)来扩展String,

 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 

我会欢迎任何反馈:)

这个给你:

 let s = "hello Swift" if let textRange = s.rangeOfString("Swift") { NSLog("exists") } 

这里只是答案的附录。

您也可以使用以下方法进行本地不区分大小写的testing:

  - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString 

例:

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

UPDATE

这是iOS和Mac OS X 10.10.x基础框架的一部分,是我原始发帖时的10.10版本的一部分。

文档生成:2014-06-05 12:26:27 -0700 OS X版本说明版权所有©2014 Apple Inc.保留所有权利。

OS X 10.10发行说明 Cocoa Foundation Framework

NSString现在有以下两个方便的方法:

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

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

您不需要为此编写任何自定义代码。 从1.2版本开始,Swift已经拥有了所有你需要的方法:

  • 得到string长度: count(string) ;
  • 检查string是否包含子string: contains(string, substring) ;
  • 检查string是否以substring开头: startsWith(string, substring)
  • 等等。

在Swift 3

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

干得好! 准备好了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 

string.containsString只在10.10 Yosemite(可能是iOS8)中可用。 在10.9中将它连接到ObjectiveC崩溃。 你正试图传递一个NSString到NSCFString。 我不知道它们的区别,但是在OS X 10.9应用程序中执行此代码时,我可以说10.9 barfs。

这里是与10.9和10.10的Swift的区别: https : //developer.apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/index.html containsString仅在10.10

上面的String的范围在10.9上工作得很好。 我发现在10.9上开发是Xcode beta2超级稳定。 我不使用操场或命令行版本的操场。 我发现如果正确的框架导入自动完成是非常有帮助的。

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 

检查是否包含“你好”

 let s = "Hello World" if s.rangeOfString("Hello") != nil { print("Yes it contains 'Hello'") } 
 // 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. } 

在iOS 8和更新版本中,您可以使用这两个NSString方法:

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

我发现了一些有趣的用例。 这些变体使用rangeOfString方法,并且包含了相等的例子来展示如何最好地使用Swift 2.0中的string的search和比较function

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

稍后在对self.myObject进行更改后,我可以引用下面的string比较例程(设置为返回Bool的惰性variables)。 这允许在任何时候检查状态。

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

当有时我需要分析该对象的缺失属性时,会发生这种变化。 stringsearch允许我find一个特定的子string被设置为零(创build对象时的默认string)。

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

Swift 3:在这里,你可以看到我的智能search扩展名string,让你searchstring,看看它是否包含,或者可能是基于search文本过滤集合。

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

你可以做你刚才提到的:

 import Foundation ... string.containsString("Swift"); 

从文档:

Swift的Stringtypes无缝桥接到Foundation的NSString类。 如果您正在使用Cocoa或Cocoa Touch中的Foundation框架,则除了本章中介绍的stringfunction之外,还可以使用整个NSString API调用您创build的任何String值。 您也可以使用任何需要NSString实例的API来使用String值。

您需要import Foundation来桥接NSString方法,并使它们可用于Swift的String类。