এনএসডেটরিয় কীগুলির উপর ভিত্তি করে এনএসআররে ফিল্টার করতে এনএসপ্রেডিকেট ব্যবহার করা


94

আমার কাছে অভিধানের একটি অ্যারে রয়েছে।

আমি একটি কী এর উপর ভিত্তি করে অ্যারে ফিল্টার করতে চাই।

আমি এটি চেষ্টা করেছি:

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

NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate];

এটি কাজ করে না, আমি কোনও ফলাফল পাই না। আমি মনে করি আমি কিছু ভুল করছি। আমি জানি এই পদ্ধতিটি যদি "স্পোর্ট" ইভার হয় was আমি মনে করি এটি যদি চাবি হয় তবে এটি সম্ভবত অন্যরকম।

আমি তবে উদাহরণ খুঁজে পেতে সক্ষম হইনি।

ধন্যবাদ


হালনাগাদ

আমি যে স্ট্রিংটি সন্ধান করছি তার চারপাশে উদ্ধৃতি যুক্ত করেছি।

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

এটি এখনও কাজ করে না।


আপডেট 2

এটি সমাধান। আমাকে আসলে একক উদ্ধৃতিগুলি সরিয়ে ফেলতে হয়েছিল, যা গাইডের কথার বিরুদ্ধে চলেছে বলে মনে হচ্ছে।

আমার আসল সমস্যাটি হ'ল আমার কাছে নেস্টেড অ্যারে ছিল এবং অভিধানগুলি আমি আসলে মূল্যায়ন করিনি। হাড় মাথা নড়াচড়া।


কেবলমাত্র উল্লেখ করার জন্য যে প্রাকটিকটি ডিফল্টরূপে কেস সংবেদনশীল (সংবেদনশীল হওয়ার জন্য [সি] ব্যবহার করুন)।
গ্রিম্পফ

উত্তর:


151

এটি কাজ করা উচিত - যতক্ষণ না ডাটা ভেরিয়েবলটি মূলত এসপিআরটি-র সাথে অভিধানযুক্ত একটি অ্যারে থাকে

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

এই ক্ষেত্রে ফিল্টার করা অভিধান রয়েছে।

(% @ এর উদ্ধৃতি দিতে হবে না, এনএসপ্রেডিকেট যখন বস্তুটি তৈরি করে তখন এটি করা হয়))


এনএসপ্রেডিকেট আইফোনে কাজ করে? এটি সিমটিতে দুর্দান্ত কাজ করে তবে আইফোনটিতে এটি চালানো একটি ত্রুটি দেয় যা এনএসপ্রেডিকেট শ্রেণিটি খুঁজে পাওয়া যায় নি।
ট্রান্সজিট হারিয়েছে

এনএসপ্রেডিকেট আইওএস 3.0 থেকে উপলব্ধ।
জেকেল

4
আমার মতো নতুন কোডারদের জন্য স্পষ্ট করতে, কোডের মূল লাইনটি হ'ল এনএসআরাই * ফিল্টারড = [ডেটা ফিল্টারড অ্যারেইউজিংপ্রেডিকেট: [এনএসপ্রেডিকেট প্রিডিকেট উইথ ফরমেট: @ "(বার ==% @)", @ "ফু"]]; ' যেখানে 'ডেটা' হ'ল এনএসডোরিচুয়ালমেন্টগুলির নাসেরে যা ইতিমধ্যে আপনার কোডে রয়েছে। (ধন্যবাদ সুরকার)
tmr

মূল নামগুলি গতিশীল হলে কী হবে?
আইপিটার

27

আমি জানি এটি পুরানো খবর তবে আমার দুটি সেন্ট যুক্ত করা। ডিফল্টরূপে আমি কমান্ডগুলি LIKE[cd]না করে বরং ব্যবহার করি [c][d]স্বরাঘাত চিহ্ন দিয়ে চিঠি তুলনা করা হয়। এটি আমার ওয়ারক্রাফ্ট অ্যাপে বিশেষত ভাল কাজ করে যেখানে লোকেরা তাদের "Vòódòó" নামটি বানান এবং টেবিলভিউতে তাদের নামের সন্ধান করা প্রায় অসম্ভব হয়ে পড়ে। [d]সম্পৃক্ত সময় তাদের স্বরাঘাত চিহ্ন রেখাচিত্রমালা। সুতরাং ভিজি নাম সম্বলিত অবজেক্টটি @"name LIKE[CD] %@", object.nameকোথায় object.name == @"voodoo"ফিরে আসবে তার একটি প্রাকটিক্যাল òó

অ্যাপল ডকুমেন্টেশন থেকে: [সিডি] অর্থ "কেস- এবং ডায়াক্রিটিক-সংবেদনশীল মত like")) স্ট্রিং সিনট্যাক্সের সম্পূর্ণ বিবরণ এবং উপলভ্য সমস্ত অপারেটরের তালিকার জন্য, প্রেডিকেট ফরম্যাট স্ট্রিং সিনট্যাক্স দেখুন



3

NSPredicate শুধুমাত্র আইফোন 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:)ইনিশিয়ালাইজার ব্যবহার করে

বিকল্প হিসাবে যদি আপনি দৃingly়ভাবে টাইপ করা API গুলিগুলির চেয়ে দৃ strongly়ভাবে টাইপ করা API গুলি পছন্দ করেন তবে আপনি আরম্ভকারী ব্যবহার করতে পারেন 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 == '%@')"


আমি ভেবেছিলাম এটি যা বলেছে তাও স্থির করবে। স্পষ্টতই উদ্ধৃতিগুলির প্রয়োজন নেই। আমি নিশ্চিত নই যে গাইডের উদ্ধৃতিটি "কী" ব্যবহার করছে তা "ব্যবহার করা উচিত"।
কোরি ফ্লয়েড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.