配列 - swift4 contains




文字列にSwiftの別の文字列が含まれているかどうかを確認するにはどうすればよいですか? (16)

Objective-Cでは、 NSString部分文字列をチェックするコードは次のとおりです。

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

しかし、私はこれをSwiftでどうやってやるのですか?


スウィフト4.2

つかいます

func contains(_ str: String) -> Bool

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

拡張方法

スウィフト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メソッドがcontainsていますが、iOS 8.0以降

スイフト3.1

あなたcontainsIgnoringCaseString 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

Swiftでコードを使って簡単にこれを行うことができます:

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

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

私を含むいくつかの人々 containsString()呼び出すことによっていくつかの奇妙な問題に遭遇したので、これが役に立つ解決策であることを願っています。

PS。 import Foundationimport Foundationことを忘れないでください


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使うこともできcontains

string.contains("swift") // false
string.contains("Swift") // true

iOS 8以降では、次の2つのNSStringメソッドを使用できます。

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

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

> 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


ここで私の最初の刺し傷はすばやい遊び場にあります。 私は2つの新しい関数(containsとincludesIgnoreCase)を提供することによって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

私はどんなフィードバックを歓迎します:)


ここの答えのうち、私は彼らがうまく動作しないと思うのですが、(NSStringにキャストして)ちょっとしたハックだと思います。 さまざまなベータリリースでこれに対する正解が変更されている可能性が非常に高いです。

ここで私が使用しているものがあります:

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

Beta 5では "!= nil"が必要になりました。


これにカスタムコードを書く必要はありません。 1.2バージョンからSwiftには、必要なすべての方法がすでに用意されています。

  • 文字列の長さを取得する: count(string) ;
  • 文字列に部分文字列が含まれているかどうかを調べる: contains(string, substring) ;
  • 文字列が部分文字列で始まるかどうかを調べる: startsWith(string, substring)
  • や。。など。

それに 'Hello'が含まれているかどうかを確認する

let s = "Hello World"

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

はい、どうぞ:

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

もう一つ。 大文字と小文字の区別をサポートします。

スウィフト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
}

ドキュメントからは、文字列のcontainsString()を呼び出すと動作するはずです。

SwiftのString型は、FoundationのNSStringクラスにシームレスにブリッジされています。 CocoaまたはCocoa TouchでFoundationフレームワークを使用している場合は、この章で説明するString機能に加えて、作成したString値をNSString API全体で呼び出すことができます。 NSStringインスタンスを必要とする任意のAPIでString値を使用することもできます。

しかし、それはそのように動作していないようです。

someString.containsString(anotherString)を使用しようとすると、 'String' does not contain a member named 'containsString'ことを示すコンパイル時エラーが発生します。

したがって、いくつかのオプションが残っています。その1つは、明示的にNSStringを使用する2つの他の2つをbridgeToObjectiveC()を使用して明示的にObjective-Cに橋渡しすることです。最後のものはStringNSString

ブリッジすることで、あなたは:

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

興味深い使用例がいくつか見つかりました。 これらのバリアントは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
    }()




swift