एनएसड्राइव का उपयोग एनएसएड्रे को फिल्टर करने के लिए एनएसड्राइव कुंजी के आधार पर करें


94

मेरे पास शब्दकोशों की एक सरणी है।

मैं एक कुंजी के आधार पर सरणी को फ़िल्टर करना चाहता हूं।

मैंने यह कोशिश की:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT ==  %@)", @"Football"];

NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate];

यह काम नहीं करता है, मुझे कोई परिणाम नहीं मिलता है। मुझे लगता है कि मैं कुछ गलत कर रहा हूं। मुझे पता है कि यह तरीका है अगर "खेल" एक आइवर था। मुझे लगता है कि यह महत्वपूर्ण है अगर यह एक कुंजी है।

मैं हालांकि एक उदाहरण नहीं मिल सका है।

धन्यवाद


अपडेट करें

मैंने उस स्ट्रिंग के चारों ओर उद्धरण जोड़े जिन्हें मैं खोज रहा हूं।

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT ==  '%@')", @"Football"];

यह अब भी काम नहीं करता है।


अपडेट २

उसे हल कर लिया। मुझे वास्तव में सिंगल कोट्स को हटाना था, जो गाइड के कहे अनुसार चलता है।

मेरी वास्तविक समस्या यह है कि मेरे पास एक नेस्टेड सरणी थी और मैं वास्तव में शब्दकोशों का मूल्यांकन नहीं कर रहा था। हड्डी का सिर हिलना।


बस यह उल्लेख करने के लिए कि विधेय डिफ़ॉल्ट रूप से संवेदनशील है (असंवेदनशील होने के लिए [c] का उपयोग करें)।
ग्रूम्फ

जवाबों:


151

यह काम करना चाहिए - जब तक कि डेटा चर वास्तव में एक सरणी है जिसमें कुंजी खेल के साथ एक शब्दकोश है

NSArray *data = [NSArray arrayWithObject:[NSMutableDictionary dictionaryWithObject:@"foo" forKey:@"BAR"]];    
NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(BAR == %@)", @"foo"]];

इस मामले में फ़िल्टर्ड में शब्दकोश है।

(% @ को उद्धृत करने की आवश्यकता नहीं है, यह तब किया जाता है जब NSPredicate ऑब्जेक्ट बनाता है।)


क्या NSPredicate iPhone पर काम करता है? यह सिम पर बहुत अच्छा काम करता है, लेकिन इसे iPhone पर चलाने से एक त्रुटि मिलती है कि NSPredicate क्लास नहीं मिल सका।
खोया इंट्रांसिट

NSPredicate iOS 3.0 के बाद से उपलब्ध है।
ज़ेकेल 1

1
मेरे जैसे नए कोडर्स के लिए स्पष्ट करने के लिए, कोड की प्रमुख पंक्ति 'NSArray * फ़िल्टर्ड = [डेटा फ़िल्टर्डArrayUsingPredicate: [NSPredicate predicateWithFormat: @ "(BAR =% @)", @ "foo"]]; जहां 'डेटा' उन nsd शब्दकोशों की संख्या है जो आपके कोड में पहले से मौजूद है। (साभार सर्कुलेट)
tmr

यदि कुंजी नाम गतिशील हैं तो क्या होगा?
3

27

मुझे पता है कि यह पुरानी खबर है, लेकिन मेरे दो सेंट जोड़ने के लिए। डिफ़ॉल्ट रूप से मैं LIKE[cd]केवल आदेशों का उपयोग करता हूं [c][d]अक्षरों की तुलना उच्चारण प्रतीकों से होती है। यह मेरे Warcraft ऐप में विशेष रूप से अच्छी तरह से काम करता है जहां लोग अपने नाम "Vòód "ó" को जादू करते हैं, जिससे एक टेबलव्यू में उनके नाम की खोज करना लगभग असंभव हो जाता है। [d]विधेय के दौरान उनके उच्चारण के प्रतीकों स्ट्रिप्स। तो @"name LIKE[CD] %@", object.nameकहाँ का एक विधेय object.name == @"voodoo"Vòód .ó नाम वाली वस्तु वापस करेगा।

Apple दस्तावेज़ीकरण से: जैसे कि [cd] का अर्थ है "केस- और डाइक्रिटिक-असंवेदनशील जैसे।") स्ट्रिंग सिंटैक्स के संपूर्ण विवरण और उपलब्ध सभी ऑपरेटरों की सूची के लिए, प्रेडिडेट फॉर्मेट स्ट्रिंग सिंटैक्स देखें



3

NSPredicate केवल iPhone 3.0 में उपलब्ध है।

जब तक आप डिवाइस पर चलने का प्रयास नहीं करेंगे, तब तक आप ध्यान नहीं देंगे।


0

स्विफ्ट 3 के साथ, जब आप शब्दकोश कुंजियों और मूल्यों के आधार पर एक विधेय के साथ शब्दकोशों की एक सरणी फ़िल्टर करना चाहते हैं, तो आप निम्नलिखित पैटर्न में से एक चुन सकते हैं।


# 1। NSPredicate init(format:arguments:)इनिशियलाइज़र का उपयोग करना

यदि आप ऑब्जेक्टिव-सी से आते हैं, तो init(format:arguments:)अपने विधेय का मूल्यांकन करने के लिए एक कुंजी-मूल्य कोडिंग शैली प्रदान करता है।

उपयोग:

import Foundation

let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]]

let predicate = NSPredicate(format: "key1 == %@", "value1")
//let predicate = NSPredicate(format: "self['key1'] == %@", "value1") // also works
let filteredArray = array.filter(predicate.evaluate)

print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]]

# 2। NSPredicate init(block:)इनिशियलाइज़र का उपयोग करना

एक विकल्प के रूप में यदि आप कड़ाई से टाइप किए गए एपीआई पर दृढ़ता से टाइप किए गए एपीआई पसंद करते हैं, तो आप इनिशलाइज़र का उपयोग कर सकते हैं init(block:)

उपयोग:

import Foundation

let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]]

let dictPredicate = NSPredicate(block: { (obj, _) in
    guard let dict = obj as? [String: String], let value = dict["key1"] else { return false }
    return value == "value1"
})

let filteredArray = array.filter(dictPredicate.evaluate)
print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]]

-1

NSPredicate संदर्भ को देखते हुए , ऐसा लगता है कि आपको उद्धरणों के साथ अपने प्रतिस्थापन चरित्र को घेरने की आवश्यकता है। उदाहरण के लिए, आपका वर्तमान विधेय पढ़ता है: (SPORT == Football)आप इसे पढ़ना चाहते हैं (SPORT == 'Football'), इसलिए आपका प्रारूप स्ट्रिंग होना चाहिए @"(SPORT == '%@')"


मैंने सोचा कि यह क्या कहा, भी। जाहिर है उद्धरण की जरूरत नहीं है। मुझे यकीन नहीं है कि गाइड क्या कह रहा है उद्धरण "के लिए" का उपयोग किया जाना चाहिए।
कोरी फ्लॉयड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.