स्विफ्ट में Predicate का उपयोग करना


93

मैं अपने पहले ऐप के लिए यहां ट्यूटोरियल (स्विफ्ट सीखना) के माध्यम से काम कर रहा हूं: http://www.appcoda.com/search-bar-tutorial-ios7/

मैं इस भाग (उद्देश्य-सी कोड) पर अटका हुआ हूं:

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

क्या कोई सलाह दे सकता है कि स्विफ्ट में NSPredicate के लिए समकक्ष कैसे बनाया जाए?

जवाबों:


158

यह वास्तव में सिर्फ एक सिंटैक्स स्विच है। ठीक है, इसलिए हमारे पास यह तरीका है:

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

स्विफ्ट में, कंस्ट्रक्टर "blahWith ..." भाग को छोड़ देते हैं और केवल एक फ़ंक्शन के रूप में वर्ग नाम का उपयोग करते हैं और फिर सीधे तर्कों पर [NSPredicate predicateWithFormat: …]जाते हैं , इसलिए बन जाएगा NSPredicate(format: …)। (एक अन्य उदाहरण के लिए, [NSArray arrayWithObject: …]बन जाएगा NSArray(object: …)। यह स्विफ्ट में एक नियमित पैटर्न है।)

तो अब हमें बस कंस्ट्रक्टर के पास आर्ग्युमेंट पास करना होगा। ऑब्जेक्टिव-सी में, एनएसएसट्रिंग शाब्दिक जैसे दिखते हैं @"", लेकिन स्विफ्ट में हम स्ट्रिंग्स के लिए उद्धरण चिह्नों का उपयोग करते हैं। तो यह हमें देता है:

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

और वास्तव में यह वही है जो हमें यहाँ चाहिए।

(संयोग से, आप कुछ अन्य उत्तरों पर ध्यान देंगे, बजाय इसके "name contains[c] \(searchText)"कि एक प्रारूप स्ट्रिंग का उपयोग करें । यह सही नहीं है। यह स्ट्रिंग प्रक्षेप का उपयोग करता है, जो विधेय प्रारूपण से अलग है और आम तौर पर इसके लिए काम नहीं करेगा।)


धन्यवाद। तुम एक दिन मुझे बचा लो!
ह्यूगो

2
अपनी पद्धति की दूसरी पंक्ति को संबोधित करने के लिए, आप विधेय का उपयोग इस प्रकार कर सकते हैं:searchResults = recipes.filter { resultPredicate.evaluateWithObject($0) }
बेन पैकर्ड

43

बहुत लंबे समय के लिए विधेय के साथ काम करना। यहाँ मेरा निष्कर्ष है (स्विफ्ट)

//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'?
टॉमसवीर

@ Ji @í Zahálka अनुरोध सुनने के साधन क्या हैं?
मुजू

28

उदाहरण 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) }

आपको (खेल का मैदान) मिलेगा

यहां छवि विवरण दर्ज करें


क्या होगा अगर ... अगर मेरे पास शब्दकोशों की एक सरणी है? मैं डेटा प्राप्त करने के लिए पार्स कैसे करूं?
रेवती दुरैराजन

1
@RevathyDurairajan आपको शब्दकोशों के सरणी को फ़िल्टर करने के लिए SELF.yourkeyname की आवश्यकता है।
पवन राय

11

आप ऑब्जेक्टिव-सी की तरह एक विधेय का उपयोग करने के बजाय किसी सरणी से सामग्री को फ़िल्टर करने के लिए स्विफ्ट में उपलब्ध फ़िल्टर का उपयोग कर सकते हैं।

स्विफ्ट 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
किसी कारण से ऐसा लिखना मेरे लिए काम नहीं कर रहा था, हालांकि myPredicateString = "नाम में [c] (सर्चटेक्स्ट)" है और फिर var resultPredicate कर रहा है: NSPredicate = NSPredicate (प्रारूप: myPredicateString) किया
AppHandwerker

5

मुझे लगता है कि यह स्विफ्ट में करने का एक बेहतर तरीका होगा:

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

1
यदि आप एक फ़िल्टर कर रहे हैं तो यह अधिक मुहावरेदार है Sequence, लेकिन ऐसे मामले हैं जहां आपको एक की आवश्यकता होगी NSPredicate, जैसे कि व्यवहार करते समय NSFetchedResultsController
जारसेन

1

स्विफ्ट में 2.2

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

स्विफ्ट 3.0 में

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

1

// अपने सरणी डेटा के अनुसार "नाम" और "मान" बदलें।

// अपने सरणी (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)
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.