web-dev-qa-db-ja.com

Swiftでの述語の使用

私は最初のアプリのチュートリアル(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の同等物を作成する方法をアドバイスできますか?

86
levitatejay

これは実際には単なる構文スイッチです。 OK、だからこのメソッド呼び出しがあります:

[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)"のようなフォーマット文字列を使用する他の回答がいくつかあります。これは正しくありません。これは文字列補間を使用します。

142
Chuck

かなり長い間、述語を操作します。これが私の結論です(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])
41
Jiří Zahálka

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

あなたは(遊び場)を取得します

enter image description here

21
gbk

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

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

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

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

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

9
Gurunath Sripad

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

 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)
}
6
PREMKUMAR

私はこれがSwiftでそれを行うためのより良い方法になると思います:

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

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
Saranjith

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

//配列(NSArray)に従って「yourDataArrayName」の名前を変更します。

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

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

 //enter code here.

        print(sortedDta)
    }
1
Hitesh Chauhan