श्रेणी के लिए स्विफ्ट क्लास कैसे बनाएं?


84

मैं अपनी मौजूदा स्विफ्ट क्लास की श्रेणी बनाना चाहता हूं, लेकिन ऐसा करने के लिए आईडीई में कोई विकल्प नहीं है।

किसी भी विचार अगर श्रेणी स्विफ्ट परियोजना में मौजूद है? या स्विफ्ट प्रोजेक्ट में समान कार्यक्षमता कैसे प्राप्त करें?


2
इसने फोन किया extension
होलेक्स

जवाबों:


128

स्विफ्ट में, आप Extensionsमौजूदा कक्षाओं, संरचनाओं और गणना प्रकारों में नई कार्यक्षमता जोड़ने के लिए उपयोग कर सकते हैं ।

वे मुख्य रूप से कुछ तरीकों से उद्देश्य-सी श्रेणियों से भिन्न होते हैं:

  • उनका नाम नहीं है
  • आपको किसी एक्सटेंशन को स्पष्ट रूप से आयात करने की आवश्यकता नहीं है। यदि आप किसी मौजूदा प्रकार में नई कार्यक्षमता जोड़ने के लिए एक्सटेंशन को परिभाषित करते हैं, तो नई कार्यक्षमता उस प्रकार के सभी मौजूदा उदाहरणों पर उपलब्ध होगी, भले ही वे एक्सटेंशन परिभाषित होने से पहले बनाए गए हों।
  • जैसा कि ऊपर कहा गया है, वे न केवल कक्षाओं के साथ, बल्कि अन्य प्रकारों के साथ भी काम करते हैं।

जैसा कि यह आज है, एक्सटेंशन कर सकते हैं:

  • संगणित गुण और संगणित स्थिर गुण जोड़ें
  • उदाहरण विधियों और प्रकार विधियों को परिभाषित करें
  • नए इनिशियलाइज़र प्रदान करें
  • सदस्यता को परिभाषित करें
  • नए नेस्टेड प्रकारों को परिभाषित और उपयोग करें
  • एक प्रोटोकॉल के लिए एक मौजूदा प्रकार बनाओ

विस्तार की घोषणा करने का मूल सिंटैक्स इस प्रकार है:

extension SomeType {
    // new functionality to add to SomeType goes here
}

चेक एप्पल के प्रलेखन कैसे स्विफ्ट में एक्सटेंशन का उपयोग करने के बारे में अधिक जानकारी के लिए।


99

ऑब्जेक्टिव सी में उन्हें श्रेणियां कहा जाता था , लेकिन स्विफ्ट में उन्हें एक्सटेंशन कहा जाता है । दोनों का उद्देश्य मौजूदा वर्गों को उपवर्ग बनाने के बिना अतिरिक्त कार्यक्षमता प्रदान करना है।

मैंने दस्तावेज़ीकरण में एक्सटेंशन के बारे में पढ़ा था, लेकिन मुझे वास्तव में समझ नहीं आया कि मैं अपने प्रोजेक्ट का उपयोग कैसे करूं, जब तक कि मैं इस ट्यूटोरियल वीडियो ( YouTube संस्करण , गीथब स्रोत ) को नहीं देख लेता

यह कैसे करना है के वीडियो से लिया गया सारांश यहां दिया गया है।

अपने प्रोजेक्ट में एक स्विफ्ट फ़ाइल जोड़ें

  • प्रोजेक्ट नेविगेटर में राइट क्लिक करें और "नई फ़ाइल ..." चुनें

  • "स्विफ्ट फ़ाइल" चुनें

  • सम्मेलन का नाम फ़ाइल नाम को उस वर्ग के नाम के रूप में सहेजना है जिसे आप प्लस ("+" चिह्न के साथ) जो आप इसके लिए कर रहे हैं। उदाहरण के लिए, "UIImage + फसल"।

एक्सटेंशन के लिए कोड लिखें

आपके द्वारा अभी बनाई गई नई स्विफ्ट फ़ाइल खोलें।

यदि आप एक का विस्तार कर रहे हैं तो आपको UIKit(इसके बजाय Foundation) आयात करना चाहिए UIView। फिर extensionउस वर्ग नाम से पहले कीवर्ड का उपयोग करें जिसे आप विस्तारित करना चाहते हैं। फिर आप कक्षा में अपनी नई विधियाँ जोड़ सकते हैं। (ध्यान दें, एक्सटेंशन नए तरीकों को जोड़ने के लिए हैं, न कि मौजूदा तरीकों को ओवरराइड करने के लिए - इसलिए नाम।)

वीडियो में, उदाहरण एक ऐसी विधि को जोड़ना था जो छवि से एक चक्र को क्रॉप करता है और इसे एक सीमा देता है।

import UIKit

extension UIImage {
    
    func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
        
        // code to create the cropped circle with colored border
        
        return newImage
    }
}

पूर्ण उदाहरण के लिए यहां देखें ।

अपने प्रोजेक्ट में कहीं भी अपने एक्सटेंशन का उपयोग करें

अब आप अपने कोड में कहीं भी उस वर्ग के लिए अपनी नई पद्धति का उपयोग कर सकते हैं, जैसे यह मानक वर्ग का हिस्सा था।

यहाँ वीडियो का उदाहरण है ( जीथब पर ):

import UIKit
class ViewController: UIViewController {
                            
    @IBOutlet var imageView : UIImageView = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let img = imageView.image
        imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
    }
}

विधि cropToCircleWithBorderColorका एक मानक हिस्सा नहीं है UIImage, लेकिन जैसा कि आप देख सकते हैं, यह वैसे ही उपयोग किया जाता है जैसे यह थे।

आगे के अध्ययन के लिए:


8

स्विफ्ट में इसे एक्सटेंशन्स कहा जाता है ! इसकी जांच - पड़ताल करें


लेकिन extensionचर को शामिल नहीं किया जा सकता है, जो चीजों को पूरी तरह से अलग बनाते हैं।
RnMss

ऑब्जेक्टिव-सी श्रेणियों में भी चर (बिना हैक्स) नहीं हो सकते।
वैलेंटाइन शेरिन

ओबजैक से जुड़ी वस्तुएं हैक नहीं हैं
मल्हार

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