Swift'de Predicate Kullanımı


94

İlk uygulamam için buradaki eğitici üzerinde çalışıyorum (Swift'i öğreniyorum): http://www.appcoda.com/search-bar-tutorial-ios7/

Bu kısımda takılı kaldım (Amaç-C kodu):

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

Swift'de NSPredicate için bir eşdeğerin nasıl oluşturulacağını önerebilecek biri var mı?

Yanıtlar:


158

Bu gerçekten sadece bir sözdizimi anahtarıdır. Tamam, bu yüzden şu yöntem çağrımız var:

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

Swift yılında kurucular "blahWith ..." bölümünü atlayın ve sadece bir fonksiyonu olarak sınıf adını kullanabilir ve daha sonra argümanları doğruca, bu yüzden [NSPredicate predicateWithFormat: …]olacaktı NSPredicate(format: …). (Başka bir örnek için, [NSArray arrayWithObject: …]olur NSArray(object: …). Bu, Swift'de normal bir kalıptır.)

Şimdi argümanları kurucuya iletmemiz gerekiyor. Objective-C'de, NSString değişmezleri gibi görünür @"", ancak Swift'de dizeler için sadece tırnak işaretleri kullanırız. Bu bize şunu verir:

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

Ve aslında tam da burada ihtiyacımız olan şey bu.

(Bu arada, diğer yanıtlardan bazılarının bunun yerine bir biçim dizesi kullandığını fark edeceksiniz "name contains[c] \(searchText)". Bu doğru değil. Bu, yüklem biçimlendirmesinden farklı olan ve genellikle bunun için işe yaramayacak olan dize enterpolasyonunu kullanır.)


Teşekkürler. Bir gün beni kurtardın!
Hugo

2
Metodunuzun ikinci satırını ele almak için yüklemi şu şekilde kullanabilirsiniz:searchResults = recipes.filter { resultPredicate.evaluateWithObject($0) }
Ben Packard

44

Doğrulukla oldukça uzun süre çalışmak. İşte benim sonucum (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
Eşit olan LIKE 'a%z'nedir?
TomSawyer

@ Jiří Zahálka İstek duymak ne anlama geliyor?
Muju

28

Swift 2.0'da nasıl kullanılacağına dair örnek

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

Alacaksın (oyun alanı)

görüntü açıklamasını buraya girin


Ya ... Eğer bir dizi sözlüğüm varsa? Verileri almak için nasıl ayrıştırırım?
Revathy Durairajan

1
@RevathyDurairajan, sözlük dizisini filtrelemek için SELF.yourkeyname'e ihtiyacınız var.
Pawan Rai

11

Objective-C'deki gibi bir yüklem kullanmak yerine bir dizideki içeriği filtrelemek için swift'te bulunan filtreleri kullanabilirsiniz.

Swift 4.0'daki bir örnek aşağıdaki gibidir:

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

Yukarıdaki örnekte, dizideki her öğe bir dize containsolduğundan, diziyi filtrelemek için yöntemi kullanabilirsiniz .

Dizi özel nesneler içeriyorsa, bu nesnenin özellikleri, öğeleri benzer şekilde filtrelemek için kullanılabilir.


5

Aşağıdaki kodu kullanın:

 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
Bazı nedenlerden dolayı bu şekilde yazmak benim için işe yaramadı, ancak myPredicateString = "name contains [c] (searchText)" yapıp sonra sonucPredicate: NSPredicate = NSPredicate (format: myPredicateString) yaptı
AppHandwerker

5

Bunun Swift'de yapmanın daha iyi bir yolu olacağını düşünüyorum:

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

1
Eğer a'yı filtreliyorsanız bu daha deyimseldir Sequence, ancak NSPredicateilgilenirken olduğu gibi a'ya ihtiyaç duyacağınız durumlar vardır NSFetchedResultsController.
Jarsen

1

Hızlı 2.2'de

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

Swift 3.0'da

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

1

// Dizi verilerinize göre "adı" ve "değeri" değiştirin.

// Dizinize (NSArray) göre "Veri DizinizAdı" adını değiştirin.

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

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

 //enter code here.

        print(sortedDta)
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.