2014-06-12 25 views
70

Tôi đang làm việc thông qua các hướng dẫn ở đây (học Swift) cho ứng dụng đầu tiên của tôi: http://www.appcoda.com/search-bar-tutorial-ios7/Sử dụng Predicate trong Swift

tôi bị mắc kẹt trên một phần này (Objective-C code):

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

Bất cứ ai có thể tư vấn cách tạo tương đương cho NSPredicate trong Swift?

Trả lời

125

Đây thực sự chỉ là một chuyển đổi cú pháp. OK, vì vậy chúng tôi có cuộc gọi phương pháp này:

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

Trong Swift, nhà thầu bỏ qua "blahWith ..." một phần và chỉ sử dụng tên lớp như một chức năng và sau đó đi thẳng đến các đối số, vì vậy [NSPredicate predicateWithFormat: …] sẽ trở thành NSPredicate(format: …). (Ví dụ khác, [NSArray arrayWithObject: …] sẽ trở thành NSArray(object: …). Đây là mẫu thông thường trong Swift.)

Vì vậy, bây giờ chúng tôi chỉ cần chuyển đối số cho hàm tạo. Trong Objective-C, NSString literals trông giống như @"", nhưng trong Swift chúng ta chỉ sử dụng dấu ngoặc kép cho chuỗi. Vì vậy, cung cấp cho chúng tôi:

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

Và thực tế đó chính xác là những gì chúng tôi cần ở đây.

(Ngẫu nhiên, bạn sẽ nhận thấy một số câu trả lời khác thay vì sử dụng chuỗi định dạng như "name contains[c] \(searchText)". Điều đó không đúng. Điều đó sử dụng nội suy chuỗi, khác với định dạng vị ngữ và nói chung sẽ không hoạt động cho điều này.)

+0

Cảm ơn. Bạn tiết kiệm cho tôi một ngày! – dusty

+2

Để giải quyết dòng thứ hai của phương thức của bạn, bạn có thể sử dụng biến vị ngữ là: 'searchResults = recipes.filter {resultPredicate.evaluateWithObject ($ 0)}' –

6

Sử dụng Các Dưới mã:

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

Vì một số lý do, việc viết như vậy không hiệu quả với tôi, tuy nhiên, hãy để myPredicateString = "name contains [c] \ (searchText)" và sau đó thực hiện var resultPredicate: NSPredicate = NSPredicate (format: myPredicateString) đã làm – AppHandwerker

5

tôi nghĩ rằng đây sẽ là một cách tốt hơn để làm điều đó trong Swift:

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

Điều này thành ngữ hơn nếu bạn lọc một chuỗi 'Sequence', nhưng có trường hợp bạn sẽ cần một 'NSPredicate', giống như khi xử lý với' NSFetchedResultsController'. – Jarsen

33

làm việc với vị cho thời gian khá dài. Đây là kết luận của tôi (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

Điều gì tương đương với 'LIKE 'là% z''? – TomSawyer

19

Ví dụ làm thế nào để sử dụng trong nhanh chóng 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) } 

Bạn sẽ nhận được (sân chơi)

enter image description here

+0

Điều gì sẽ xảy ra nếu ... Nếu tôi có một loạt từ điển? Làm cách nào để phân tích cú pháp để lấy dữ liệu? –

+0

@RevathyDurairajan bạn cần SELF.yourkeyname để lọc các bộ từ điển. – Pawan

0

Trong nhanh chóng 2.2

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

Trong nhanh chóng 3,0

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

Bạn có thể sử dụng bộ lọc có sẵn trong nhanh chóng để lọc nội dung từ một mảng thay vì sử dụng một vị giống như trong Objective-C.

Ví dụ trong Swift 4.0 như sau:

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

Trong ví dụ trên, vì mỗi phần tử trong mảng là chuỗi bạn có thể sử dụng phương pháp contains để lọc mảng.

Nếu mảng chứa đối tượng tùy chỉnh, thì các thuộc tính của đối tượng đó có thể được sử dụng để lọc các phần tử tương tự.

Các vấn đề liên quan