কীভাবে একটি ক্লাস সুইফটে একটি প্রোটোকলের সাথে সামঞ্জস্য করা যায়?


121

উদ্দেশ্য সি-তে:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

সুইফটে:

class CustomDataSource : UITableViewDataSource {

}

তবে, একটি ত্রুটি বার্তা উপস্থিত হবে:

  1. টাইপ 'সেলডাটাসডাটাসোর্স' প্রোটোকল 'এনএসবজেক্টপ্রোটোকল' এর সাথে খাপ খায় না
  2. টাইপ করুন 'সেলডাটা ডেটাসোর্স' প্রোটোকলের সাথে সম্মতি দেয় না 'ইউআইটিবেলভিউ ডেটাসোর্স'

সঠিক উপায়টি কী হওয়া উচিত?


1
আপনার ত্রুটি বার্তাগুলিতে শ্রেণীর নামটি আপনার সরবরাহিত কোডের সাথে মেলে না বলে মনে হচ্ছে?
ম্যাট গিবসন

2
সুইফ্ট ক্লাসগুলি ডিফল্টভাবে এনএসবজেক্ট থেকে উত্তরাধিকারী হয় না। অন্যথায় নির্দিষ্ট না করে এগুলি তাদের নিজস্ব বেস ক্লাস।
টিম

উত্তর:


251

টাইপ 'সেলডাটাসডাটাসোর্স' প্রোটোকল 'এনএসবজেক্টপ্রোটোকল' এর সাথে খাপ খায় না

তুমি তোমার ক্লাসে উত্তরাধিকারী করতে কাছ থেকে পেয়েছ NSObjectসাথে সামঞ্জস্য থেকে NSObjectProtocol। ভ্যানিলা সুইফ্ট ক্লাস না। তবে UIKitপ্রত্যাশা অনেক অংশ NSObject

class CustomDataSource : NSObject, UITableViewDataSource {

}

কিন্তু এই:

টাইপ করুন 'সেলডাটা ডেটাসোর্স' প্রোটোকলের সাথে সম্মতি দেয় না 'ইউআইটিবেলভিউ ডেটাসোর্স'

প্রত্যাশিত. আপনার ক্লাস প্রোটোকলের সমস্ত প্রয়োজনীয় পদ্ধতি প্রয়োগ না করা পর্যন্ত ত্রুটি পাবেন।

তাই কোডিং করুন :)


ধন্যবাদ @ অ্যালেক্স; আপনি আমার দিনটি বাঁচিয়েছেন, যেহেতু আমি আমার সুইফ্ট ক্লাসটি ইউআইসিএল্লেশনভিউ ডেটাসোর্স প্রোটোকলের সাথে মানিয়ে নিতে বেশ কিছুক্ষণ লড়াই করে যাচ্ছি। আমার ক্লাসে এনএসবজেক্ট উত্তরাধিকার যুক্ত করা এটি সমাধান করেছে!
আইওএস-কোডার

1
আমি কি কেবলমাত্র একজনই মনে করি যে একটি সংকলন সতর্কতা যথেষ্ট ছিল?
মাগু

@ ম্যাগু অবশ্যই আপনার বোঝা অপর্যাপ্ত ছিল। 'প্রোটোকল অনুসারে নয়' এর অর্থ আমার কাছে 'এনএসবজেক্টের উত্তরাধিকার' নয়।
রায় ফালক

@ রয়ফ্যালাক বলতে চাইছি একটি ত্রুটির জন্য একটি সংকলন সতর্কতা যথেষ্ট ছিল ... আপনার সমস্ত ক্ষেত্রে পুরো প্রোটোকলটি প্রয়োগ করার প্রয়োজন হতে পারে না এবং এটি করার আগে এটি তৈরি করতে চান ... এটি কোনও বড় বিষয় নয়, তবে কিছুটা অপ্রয়োজনীয় বোধ করেন ।
মাগু

0

প্রোটোকলের সাথে সামঞ্জস্য করার আগে কোনও শ্রেণিকে অভিভাবক শ্রেণীর কাছ থেকে উত্তরাধিকারী হতে হয়। এটি করার প্রধানত দুটি উপায় রয়েছে।

একটি উপায় হ'ল আপনার ক্লাসটি উত্তরাধিকার সূত্রে প্রাপ্ত NSObjectএবং UITableViewDataSourceএকসাথে মেনে চলা । এখন আপনি যদি প্রোটোকলে ফাংশনগুলি সংশোধন করতে চান তবে আপনাকে overrideএই জাতীয় ফাংশন কল করার আগে কীওয়ার্ড যুক্ত করতে হবে

class CustomDataSource : NSObject, UITableViewDataSource {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

তবে এটি কখনও কখনও আপনার কোড অগোছালো হয়ে যায় কারণ আপনার কাছে মেনে চলার জন্য অনেকগুলি প্রোটোকল থাকতে পারে এবং প্রতিটি প্রোটোকলে বিভিন্ন প্রতিনিধি ফাংশন থাকতে পারে। এই পরিস্থিতিতে, আপনি প্রোটোকল অনুসারে কোডটি ব্যবহার করে প্রধান শ্রেণীর থেকে আলাদা করতে পারেন extensionএবং আপনাকে overrideএক্সটেনশনে কীওয়ার্ড যুক্ত করার দরকার নেই । সুতরাং উপরের কোডটির সমতুল্য হবে

class CustomDataSource : NSObject{
    // Configure the object...
}

extension CustomDataSource: UITableViewDataSource {

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

0

এক্সকোড 9, সুইফট ডেটাসোর্স এবং প্রতিনিধিদের সমস্ত বাধ্যতামূলক পদ্ধতিগুলি কার্যকর করতে সহায়তা করে।

এখানে উদাহরণ UITableViewDataSource:

বাধ্যতামূলক পদ্ধতিগুলি প্রয়োগ করতে সতর্কতা / ইঙ্গিত দেখায়:

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

'ফিক্স' বোতামে ক্লিক করুন, এটি কোডে সমস্ত বাধ্যতামূলক পদ্ধতি যুক্ত করবে:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.