मेरे पास एक वर्ग है जो UITableView का उपयोग कर रहा है, उदाहरण के लिए:

class tableViewController {

    tableView.dataSource = self
    tableView.delegate = self

मैंने देखा कि कार्यों में से एक गलत प्रोटोकॉल एक्सटेंशन में है:

extension tableViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {

लेकिन यह -> . में होना चाहिए

extension tableViewController: UITableViewDelegate {

यह कुछ कोड में है जो मैंने काफी समय से किया है (यहां तक ​​​​कि एक जारी किए गए ऐप में भी, लेकिन इसने कभी भी गलत व्यवहार या त्रुटियों का उत्पादन नहीं किया है।

क्या यह अपेक्षित व्यवहार किसी अंतर्निहित तंत्र के कारण है।

2
benc 24 जिंदा 2021, 08:59

2 जवाब

सबसे बढ़िया उत्तर

इससे कोई फर्क नहीं पड़ता कि प्रतिनिधि विधियों को किस एक्सटेंशन में घोषित किया गया है, जब तक कि प्रोटोकॉल के अनुरूप घोषित करने वाले एक्सटेंशन से विधियां दिखाई दे रही हैं।

UITableViewDelegate में विधियों के लिए tableViewController में गवाहों को खोजने के लिए, कंपाइलर उन सभी विधियों को देखता है जो tableViewController में हैं। खैर, tableViewController के किसी भी दृश्य विस्तार में विधियां है एक "विधि है जो tableViewController में है", है ना? तो स्वाभाविक रूप से, संकलक दोनों एक्सटेंशन पर विचार करेगा।

मैं विधियों को एक अलग विस्तार में भी घोषित कर सकता हूं:

extension tableViewController: UITableViewDataSource { /* empty */ }
extension tableViewController: UITableViewDelegate { /* empty */ }
extension tableViewController {
    // all the data source and delegate methods go here
}

यह भी काम करता है, क्योंकि तीसरे एक्सटेंशन के तरीके पहले दो एक्सटेंशन से दिखाई देते हैं।

डेटा स्रोत विधियों को प्रतिनिधि एक्सटेंशन में रखना अच्छा अभ्यास है, हालांकि, एक अलग कहानी है। मैं कहूंगा कि यह काफी भ्रमित करने वाला है। यहां तक ​​​​कि अगर संकलक इसकी अनुमति देता है, तो आपको इसे तब तक नहीं करना चाहिए जब तक आपके पास बहुत अच्छा कारण न हो।

0
Sweeper 24 जिंदा 2021, 09:09

एक्सटेंशन Inheritance नहीं है जो पदानुक्रम का पालन करता है, एक्सटेंशन में कोई पदानुक्रम नहीं है। इसका मतलब है कि यदि आपकी कक्षा के किसी भी विस्तार में प्रोटोकॉल की पुष्टि होती है, तो उस प्रोटोकॉल के कार्य अन्य एक्सटेंशन के भीतर पहुंच योग्य होंगे।

0
Mahdiayr Taheri 24 जिंदा 2021, 09:09