स्विफ्ट में एक वर्ग को एक प्रोटोकॉल के अनुरूप कैसे बनाया जाए?


121

उद्देश्य-सी में:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

स्विफ्ट में:

class CustomDataSource : UITableViewDataSource {

}

हालाँकि, एक त्रुटि संदेश दिखाई देगा:

  1. टाइप करें 'सेलडॉटसैडसोर्स' प्रोटोकॉल के अनुरूप नहीं है 'NSObjectProtocol'
  2. टाइप 'सेलडाटसडाटा सोर्स' प्रोटोकॉल के अनुरूप नहीं है

सही तरीका क्या होना चाहिए?


1
आपकी त्रुटि संदेशों में वर्ग का नाम आपके दिए गए कोड से मेल नहीं खाता है?
मैट गिब्सन

2
NSObject से स्विफ्ट क्लासेस डिफ़ॉल्ट रूप से इनहेरिट नहीं होती हैं। वे अपने स्वयं के आधार वर्ग हैं जब तक कि अन्यथा निर्दिष्ट न हो।
टिम

जवाबों:


251

टाइप करें 'सेलडॉटसैडसोर्स' प्रोटोकॉल के अनुरूप नहीं है 'NSObjectProtocol'

आपको अपनी कक्षा NSObjectको इसके अनुरूप बनाना होगा NSObjectProtocol। वेनिला स्विफ्ट कक्षाएं नहीं करती हैं। लेकिन UIKitउम्मीद के कई हिस्से NSObjectएस।

class CustomDataSource : NSObject, UITableViewDataSource {

}

लेकिन यह:

टाइप 'सेलडाटसडाटा सोर्स' प्रोटोकॉल के अनुरूप नहीं है

अपेक्षित है। आपको तब तक त्रुटि मिलेगी जब तक कि आपकी कक्षा प्रोटोकॉल के सभी आवश्यक तरीकों को लागू नहीं करती है।

तो कोडिंग प्राप्त करें :)


धन्यवाद @ एलेक्स; आपने मेरा दिन बचाया, क्योंकि मैं अपनी स्विफ्ट क्लास को UICollectionViewDataSource प्रोटोकॉल के अनुरूप पाने के लिए काफी संघर्ष कर रहा हूं। मेरी कक्षा में NSObject विरासत को जोड़कर इसे हल किया!
iOS-Coder

1
क्या मैं अकेला हूँ जो सोचता है कि एक संकलन पर्याप्त था?
मागू

@ मागू निश्चित रूप से आप अपर्याप्त थे। 'प्रोटोकॉल के अनुरूप नहीं है' का मतलब 'NSObject से विरासत में' नहीं है।
रॉय फॉक

@RoyFalk मेरा मतलब है कि एक संकलित चेतावनी एक त्रुटि पर पर्याप्त थी ... आपको सभी मामलों में पूरे प्रोटोकॉल को लागू करने की आवश्यकता नहीं हो सकती है और ऐसा करने से पहले निर्माण करना चाह सकते हैं ... यह एक बड़ी बात नहीं है, लेकिन थोड़ा अनावश्यक लगता है ।
मागू

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

Xcode 9, Swift Datasource & Delegates के सभी अनिवार्य तरीकों को लागू करने में मदद करता है।

यहाँ का उदाहरण है UITableViewDataSource :

अनिवार्य तरीकों को लागू करने के लिए चेतावनी / संकेत दिखाता है:

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

'फिक्स' बटन पर क्लिक करें, यह कोड में सभी अनिवार्य तरीके जोड़ देगा:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.