সুইফটে প্রিডিকেট ব্যবহার করা


94

আমি আমার প্রথম অ্যাপটির জন্য এখানে (সুইফট শিখতে) টিউটোরিয়ালটির মাধ্যমে কাজ করছি: 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];
}

যে কেউ সুইফটে এনএসপ্রেডিকেটের সমতুল্য তৈরি করতে পরামর্শ দিতে পারেন?

উত্তর:


158

এটি সত্যিই কেবল একটি সিনট্যাক্স সুইচ। ঠিক আছে, সুতরাং আমাদের কাছে এই পদ্ধতি কলটি রয়েছে:

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

সুইফ্টে, কনস্ট্রাক্টররা "ব্লাহউইথ ..." অংশটি এড়িয়ে যান এবং ক্লাসের নামটি একটি ফাংশন হিসাবে ব্যবহার করেন এবং তারপরে সরাসরি আর্গুমেন্টে যান, তাই [NSPredicate predicateWithFormat: …]হয়ে যায় NSPredicate(format: …)। (অন্য একটি উদাহরণের জন্য, [NSArray arrayWithObject: …]হয়ে উঠবে NSArray(object: …)This এটি সুইফটে নিয়মিত প্যাটার্ন)

সুতরাং এখন আমাদের কেবল কনস্ট্রাক্টরের কাছে আর্গুমেন্টগুলি পাস করতে হবে। অবজেক্টিভ-সি-তে, এনএসএস @""স্ট্রিং লিটারেল দেখতে দেখতে কিন্তু সুইফটে আমরা কেবল স্ট্রিংয়ের জন্য উদ্ধৃতি চিহ্ন ব্যবহার করি। সুতরাং যে আমাদের দেয়:

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

এবং প্রকৃতপক্ষে আমাদের এখানে এটি ঠিক প্রয়োজন।

(ঘটনাক্রমে, আপনি এর পরিবর্তে অন্য কয়েকটি উত্তর লক্ষ্য করুন যে পরিবর্তে একটি বিন্যাসের স্ট্রিং ব্যবহার করবেন "name contains[c] \(searchText)"। এটি সঠিক নয় That এটি স্ট্রিং ইন্টারপোলেশন ব্যবহার করে, যা প্রাকটিক বিন্যাস থেকে পৃথক এবং সাধারণত এর জন্য কাজ করবে না)))


ধন্যবাদ তুমি আমাকে একদিন বাঁচাও!
হুগো

4
আপনার পদ্ধতির দ্বিতীয় লাইনটি সম্বোধন করার জন্য, আপনি প্রাকটিকটিটি ব্যবহার করতে পারেন:searchResults = recipes.filter { resultPredicate.evaluateWithObject($0) }
বেন প্যাকার্ড

44

বেশ দীর্ঘ সময়ের জন্য শিকারী নিয়ে কাজ করা। এখানে আমার উপসংহারটি (সুইফট)

//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])

4
এর সাথে কি সমান LIKE 'a%z'?
টমসওয়ায়ার

@ জিří জহালকা অনুরোধ শোনার অর্থ কী?
মুজু

28

কীভাবে সুইফট ২.০ এ ব্যবহার করবেন উদাহরণ

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

আপনি পাবেন (খেলার মাঠ)

এখানে চিত্র বর্ণনা লিখুন


কী যদি ... আমার কাছে অভিধানের একটি অ্যারে থাকে? আমি কীভাবে ডেটা পেতে পার্স করব?
রেভ্যাথি দুরাইরজান

4
@ রেভাথী দুরাইরজান আপনার অভিধানের অ্যারে ফিল্টার করার জন্য আপনার নিজের প্রয়োজন SYF.Yourkeyname।
পবন রাই

11

আপনি অবজেক্টিভ-সি-তে প্রাক্টিকেট ব্যবহার না করে অ্যারে থেকে সামগ্রী ফিল্টার করতে দ্রুতগামী উপলব্ধ ফিল্টারগুলি ব্যবহার করতে পারেন।

সুইফট ৪.০-তে একটি উদাহরণ নিম্নরূপ:

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

উপরের উদাহরণে, অ্যারেতে প্রতিটি উপাদান একটি স্ট্রিং তাই আপনি containsঅ্যারে ফিল্টার করার জন্য পদ্ধতিটি ব্যবহার করতে পারেন ।

যদি অ্যারেটিতে কাস্টম অবজেক্ট থাকে তবে সেই বস্তুর বৈশিষ্ট্যগুলি একইভাবে উপাদানগুলিকে ফিল্টার করতে ব্যবহার করা যেতে পারে।


5

নীচের কোডটি ব্যবহার করুন:

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

4
কোনও কারণে এটি লেখার জন্য এটি আমার পক্ষে কার্যকর হয়নি তবে মাইপ্রডিকেটস্ট্রিং = "নাম অন্তর্ভুক্ত করে [সি] (অনুসন্ধানটেক্সট) করুন" এবং তারপরে ফলাফল ফলাফল করা হয়েছে: এনএসপ্রেডিকেট = এনএসপ্রেডিট (ফর্ম্যাট: মাইপ্রিডেটস্ট্রিং) করেছে
অ্যাপহ্যান্ডওয়ার্কার

5

আমি মনে করি এটি সুইফটে এটি করার আরও ভাল উপায় হবে:

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

4
এর ফলে বেশি কথ্য আপনি একটি ফিল্টারিং করছি 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)
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.