Swiftでの述語の使用


93

私の最初のアプリのチュートリアル(Swiftの学習)を進めています。http//www.appcoda.com/search-bar-tutorial-ios7/

私はこの部分で立ち往生しています(Objective-Cコード):

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c]         %@", searchText];
    searchResults = [recipes filteredArrayUsingPredicate:resultPredicate];
}

誰かがSwiftでNSPredicateの同等物を作成する方法をアドバイスできますか?

回答:


157

これは実際には単なる構文スイッチです。では、次のメソッドを呼び出します。

[NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];

Swiftでは、コンストラクターは "blahWith…"の部分をスキップして、クラス名を関数として使用し、引数に直接進むため、[NSPredicate predicateWithFormat: …]になりNSPredicate(format: …)ます。(別の例で[NSArray arrayWithObject: …]は、になりNSArray(object: …)ます。これはSwiftの通常のパターンです。)

したがって、コンストラクタに引数を渡すだけです。Objective-CではNSStringリテラルはのよう@""に見えますが、Swiftでは文字列に引用符を使用します。したがって、次のようになります。

let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)

実際、それがまさにここで必要なものです。

(ちなみに、他のいくつかの回答では、代わりにのようなフォーマット文字列を使用して"name contains[c] \(searchText)"います。これは正しくありません。文字列の補間を使用しています。これは述語のフォーマットとは異なり、通常は機能しません。)


ありがとう。あなたはある日私を救います!
Hugo

2
あなたの方法の2行目に対処するために、あなたに述語を使用することがあります:searchResults = recipes.filter { resultPredicate.evaluateWithObject($0) }
ベン・パッカード

43

かなり長い間、述部を処理します。これが私の結論です(SWIFT)

//Customizable! (for me was just important if at least one)
request.fetchLimit = 1


//IF IS EQUAL

//1 OBJECT
request.predicate = NSPredicate(format: "name = %@", txtFieldName.text)

//ARRAY
request.predicate = NSPredicate(format: "name = %@ AND nickName = %@", argumentArray: [name, nickname])


// IF CONTAINS

//1 OBJECT
request.predicate = NSPredicate(format: "name contains[c] %@", txtFieldName.text)

//ARRAY
request.predicate = NSPredicate(format: "name contains[c] %@ AND nickName contains[c] %@", argumentArray: [name, nickname])

1
何と同じLIKE 'a%z'ですか?
TomSawyer 2016年

@JiříZahálkaリクエストヒアリングとは何ですか?
Muju

28

Swift 2.0での使用例

let dataSource = [
    "Domain CheckService",
    "IMEI check",
    "Compliant about service provider",
    "Compliant about TRA",
    "Enquires",
    "Suggestion",
    "SMS Spam",
    "Poor Coverage",
    "Help Salim"
]
let searchString = "Enq"
let predicate = NSPredicate(format: "SELF contains %@", searchString)
let searchDataSource = dataSource.filter { predicate.evaluateWithObject($0) }

(遊び場)を取得します

ここに画像の説明を入力してください


辞書の配列がある場合はどうなりますか?解析してデータを取得するにはどうすればよいですか?
Revathy Durairajan 2016年

1
@RevathyDurairajan辞書の配列をフィルタリングするには、SELF.yourkeynameが必要です。
Pawan Rai

11

Objective-Cのように述語を使用する代わりに、swiftで利用可能なフィルターを使用して、配列からコンテンツをフィルタリングできます。

Swift 4.0の例は次のとおりです。

var stringArray = ["foundation","coredata","coregraphics"]
stringArray = stringArray.filter { $0.contains("core") }

上記の例では、配列の各要素は文字列であるため、containsメソッドを使用して配列をフィルタリングできます。

配列にカスタムオブジェクトが含まれている場合、そのオブジェクトのプロパティを使用して、要素を同様にフィルタリングできます。


6

以下のコードを使用します。

 func filterContentForSearchText(searchText:NSString, scopes scope:NSString)
{
    //var searchText = ""

    var resultPredicate : NSPredicate = NSPredicate(format: "name contains[c]\(searchText)", nil)

    //var recipes : NSArray = NSArray()

    var searchResults = recipes.filteredArrayUsingPredicate(resultPredicate)
}

1
何らかの理由でそのように記述してもうまくいきませんでしたが、let myPredicateString = "name contains [c](searchText)"を実行してから、var resultPredicate:NSPredicate = NSPredicate(format:myPredicateString)を実行しました
AppHandwerker

5

これはSwiftでそれを行うためのより良い方法だと思います:

func filterContentForSearchText(searchText:NSString, scope:NSString)
{
   searchResults = recipes.filter { name.rangeOfString(searchText) != nil  }
}

1
あなたはフィルタリングしている場合、これは、より慣用的であるSequenceが、あなたが必要となる場合がありますNSPredicateを扱うときのように、NSFetchedResultsController
ジャーセン2015

1

Swift 2.2では

func filterContentForSearchText(searchText: String, scope: String) {
    var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
    searchResults = (recipes as NSArray).filteredArrayUsingPredicate(resultPredicate)
}

Swift 3.0では

func filterContent(forSearchText searchText: String, scope: String) {
        var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
        searchResults = recipes.filtered(using: resultPredicate)
    }

1

//配列データに応じて「名前」と「値」を変更します。

// "yourDataArrayName"の名前を配列(NSArray)に応じて変更します。

    let resultPredicate = NSPredicate(format: "SELF.name contains[c] %@", "value")

    if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {

 //enter code here.

        print(sortedDta)
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.