在 Objective-C
中检查 NSString
中子字符串的代码是:
NSString *string = @"hello Swift";
NSRange textRange =[string rangeOfString:@"Swift"];
if(textRange.location != NSNotFound)
{
NSLog(@"exists");
}
但是我如何在 Swift 中做到这一点?
if largeText.contains("stringToSearchFor") { print("yes") }
你可以用 Swift 做同样的调用:
斯威夫特 4 和斯威夫特 5
在 Swift 4 中,String 是 Character
值的集合,在 Swift 2 和 3 中不是这样的,所以你可以使用这个更简洁的代码1:
let string = "hello Swift"
if string.contains("Swift") {
print("exists")
}
斯威夫特 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
脚注
请记住,在字符串上使用集合函数有一些极端情况,可能会给您带来意想不到的结果,例如在处理表情符号或其他字形簇(如重音字母)时。
延伸方式
斯威夫特 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 有 contains 方法,但它可以从 iOS 8.0+
斯威夫特 3.1
您可以为 String
编写扩展程序 contains:
和 containsIgnoringCase
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
Foundation
,否则不再需要... containsString
可以正常工作。
从文档看来,在 String 上调用 containsString()
应该可以工作:
Swift 的 String 类型无缝连接到 Foundation 的 NSString 类。如果你在 Cocoa 或 Cocoa Touch 中使用 Foundation 框架,除了本章描述的 String 特性之外,整个 NSString API 都可以调用你创建的任何 String 值。您还可以将 String 值与任何需要 NSString 实例的 API 一起使用。
但是,它似乎不是那样工作的。
如果您尝试使用 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")
}
通过将字符串显式键入为 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")
}
[__NSCFString containsString:]: unrecognized selector sent to instance
。另外,我在开发文档中找不到方法 containsString
来确认它是否适用于 iOS 8。
另一个。支持大小写和变音符号选项。
斯威夫特 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")
}
斯威夫特 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
import Foundation
,否则这将不起作用。
import Foundation
中的 import UIKit
是必需的,至少在 iOS 11 和 Swift 4 中是这样。
在斯威夫特 4.2
利用
func contains(_ str: String) -> Bool
例子
let string = "hello Swift"
let containsSwift = string.contains("Swift")
print(containsSwift) // prints true
> 在 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 中非常轻松地做到这一点:
let string = "hello Swift";
let subString = (string as NSString).containsString("Swift")
if(subString){println("Exist")}
在这里的所有答案中,我认为它们要么不起作用,要么有点像 hack(转换回 NSString)。很可能这个问题的正确答案已经随着不同的 beta 版本而改变。
这是我使用的:
let string: String = "hello Swift"
if string.rangeOfString("Swift") != nil
{
println("exists")
}
Beta 5 需要“!= nil”。
只是这里答案的附录。
您还可以使用以下方法进行本地不区分大小写的测试:
- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString
例子:
import Foundation
var string: NSString = "hello Swift"
if string.localizedCaseInsensitiveContainsString("Hello") {
println("TRUE")
}
更新
这是 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;
这是我在 swift 操场上的第一次尝试。我通过提供两个新函数(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")
}
您无需为此编写任何自定义代码。从 1.2 版本开始,Swift 已经拥有了你需要的所有方法:
获取字符串长度:count(string);
检查字符串是否包含子字符串: contains(string, substring);
检查字符串是否以子字符串开头:startsWith(string, substring)
等等。
在斯威夫特 3
if((a.range(of: b!, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil)) != nil){
print("Done")
}
你可以做你提到的:
import Foundation
...
string.contains("Swift");
从文档:
Swift 的 String 类型无缝连接到 Foundation 的 NSString 类。如果你在 Cocoa 或 Cocoa Touch 中使用 Foundation 框架,除了本章描述的 String 特性之外,整个 NSString API 都可以调用你创建的任何 String 值。您还可以将 String 值与任何需要 NSString 实例的 API 一起使用。
您需要 import Foundation
来桥接 NSString
方法并使它们可用于 Swift 的 String 类。
干得好!为 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。
以下是 Swift 与 10.9 和 10.10 的区别: https://developer.apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/index.html containsString 仅在 10.10 中可用
上面的字符串范围在 10.9 上效果很好。我发现使用 Xcode beta2 在 10.9 上进行开发非常稳定。我不通过操场或命令行版本的操场使用操场。我发现如果导入了正确的框架,自动完成功能非常有用。
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
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's answer,这是完全正确的。我不知道为什么这么多的答案会经历这么多麻烦来重新创建 Foundation
的 String.contains(subString: String)
方法。
使用 swift 4 中的新语法,您可以
string.contains("Swift 4 is the best")
string 是你的字符串变量
检查它是否包含“你好”
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.
}
Swift 3:在这里你可以看到我的智能搜索扩展,它可以让你搜索字符串以查看它是否包含,或者根据搜索文本过滤集合。
https://github.com/magonicolas/Swift-Smart-String-Search
如果您想检查一个字符串中是否包含另一个子字符串,您也可以像这样检查它,
var name = String()
name = "John has two apples."
现在,在这个特定的字符串中,如果你想知道它是否包含水果名称“苹果”,你可以这样做,
if name.contains("apple") {
print("Yes , it contains fruit name")
} else {
print("it does not contain any fruit 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 中字符串的搜索和比较特性
//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)
}()
当有时我需要分析该对象上缺少的属性时,会发生这种情况的变体。字符串搜索允许我找到设置为 nil 的特定子字符串(创建对象时的默认值)。
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 5,不区分大小写:
如果 string.localizedLowercase.contains("swift".localizedLowercase){
SWIFT 4 非常简单!!
if (yourString.contains("anyThing")) {
print("Exist")
}
$ 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") ^~~~~
提供未经测试但无效的答案。打印!=打印。
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}
,它将为您表示为 nil。如果它是一个实际范围,它会为您表示为 Swift Range(可选)。凉爽的。NSString
的.rangeOfString()
。这是调用String
的.rangeOfString()
,它被声明为func rangeOfString(aString: String, options mask: NSStringCompareOptions = default, range searchRange: Range<Index>? = default, locale: NSLocale? = default) -> Range<Index>?