在Objective-C
代码中检查的子字符串NSString
是:
NSString *string = @"hello Swift";
NSRange textRange =[string rangeOfString:@"Swift"];
if(textRange.location != NSNotFound)
{
NSLog(@"exists");
}
但是我该如何在Swift中做到这一点?
在Objective-C
代码中检查的子字符串NSString
是:
NSString *string = @"hello Swift";
NSRange textRange =[string rangeOfString:@"Swift"];
if(textRange.location != NSNotFound)
{
NSLog(@"exists");
}
但是我该如何在Swift中做到这一点?
Answers:
您可以使用Swift进行完全相同的调用:
在Swift 4中,String是Character
值的集合,在Swift 2和3中并不是这样,因此您可以使用以下更简洁的代码1:
let string = "hello Swift"
if string.contains("Swift") {
print("exists")
}
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
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,则表示为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>?
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+开始使用
你可以写扩展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
}
}
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
可以正常工作。
从文档看来,调用containsString()
String应该可以:
Swift的String类型无缝地连接到Foundation的NSString类。如果您正在Cocoa或Cocoa Touch中使用Foundation框架,则除了本章介绍的String功能外,还可以使用整个NSString API来调用您创建的任何String值。您还可以在需要NSString实例的任何API中使用String值。
但是,它似乎无法正常工作。
如果尝试使用someString.containsString(anotherString)
,则会出现指出的编译时错误'String' does not contain a member named 'containsString'
。
因此,您剩下几个选择,其中一个是String
通过使用bridgeToObjectiveC()
其他两个明确NSString
涉及String
到an 的方式将您显式地连接到Objective-C,最后一个涉及将强制转换为anNSString
通过桥接,您将获得:
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起提供不区分大小写和变音符号的功能。
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 UIKit
的import Foundation
要求,至少与iOS 11和夫特4.
您可以使用以下代码在Swift中轻松完成此操作:
let string = "hello Swift";
let subString = (string as NSString).containsString("Swift")
if(subString){println("Exist")}
只是这里答案的附录。
您还可以使用以下方法进行本地不区分大小写的测试:
- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString
例:
import Foundation
var string: NSString = "hello Swift"
if string.localizedCaseInsensitiveContainsString("Hello") {
println("TRUE")
}
更新
这是iOS和Mac OS X 10.10.x的Foundation框架的 一部分,在我最初发帖时是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;
这是我在这个迅速的操场上第一次刺伤。我通过提供两个新函数(包含和包含IgnoreCase)来扩展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
我欢迎任何反馈:)
您不需要为此编写任何自定义代码。从1.2版本开始,Swift已经拥有您需要的所有方法:
count(string)
;contains(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优胜美地(可能还有iOS8)中可用。还将其桥接到ObjectiveC在10.9中崩溃。您正在尝试将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上效果很好。我发现在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
检查是否包含“ Hello”
let s = "Hello World"
if s.rangeOfString("Hello") != nil {
print("Yes it contains 'Hello'")
}
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
的String.contains(subString: String)
方法。
// 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:在这里您可以看到我的智能搜索扩展字符串,它使您可以搜索字符串以查看其是否包含字符串,或者可以根据搜索文本过滤集合。
我发现了几个有趣的用例。这些变体使用rangeOfString方法,并且我包括一个相等的示例,以说明如何最好地使用Swift 2.0中Strings的搜索和比较功能。
//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
}()
如果您要检查一个字符串中是否包含另一个子字符串,也可以像这样检查它,
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)
}
希望这对您有用。
您可以做您刚才提到的事情:
import Foundation
...
string.contains("Swift");
从文档:
Swift的
String
类型无缝连接到Foundation的NSString
类。如果您正在Cocoa或Cocoa Touch中使用Foundation框架,则整个NSString
String
,除了本章介绍的String功能之外 API都可以调用您创建的任何 值。您还可以在需要NSString实例的任何API中使用String值。
您需要import Foundation
桥接NSString
方法并使它们可用于Swift的String类。
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") ^~~~~
通过提供无效的未经测试的答案。打印!=打印。