मैंने बहुत सारे कारण देखे हैं कि फ़ंक्शन के बजाय वेरिएबल्स का उपयोग करके एपीआई को डिजाइन करना समस्याग्रस्त है और मेरे लिए गणना की गई संपत्तियों का उपयोग करके वर्कअराउंड की तरह महसूस होता है। आपके उदाहरण चर को संक्षिप्त रखने के लिए अच्छे कारण हैं। यहाँ मैंने एक प्रोटोकॉल ऑटोमोबाइल बनाया है जो कार के अनुरूप है। इस प्रोटोकॉल में एक एक्सेसर विधि है जो चेसिस ऑब्जेक्ट को लौटाती है। चूंकि कार इसके अनुरूप है, रेसकर उपवर्ग इसे ओवरराइड कर सकता है और एक अलग चेसिस उपवर्ग को वापस कर सकता है। यह कार वर्ग को एक इंटरफ़ेस (ऑटोमोबाइल) और रेसकार क्लास के लिए प्रोग्राम करने की अनुमति देता है जो कि रेसिंगचैसिस के बारे में जानता है कि _racingChassis चर को सीधे एक्सेस कर सकता है।
class Chassis {}
class RacingChassis: Chassis {}
protocol Automobile {
func chassis() -> Chassis
}
class Car: Automobile {
private var _chassis: Chassis
init () {
_chassis = Chassis()
}
func chassis() -> Chassis {
return _chassis
}
}
class RaceCar: Car {
private var _racingChassis: RacingChassis
override init () {
_racingChassis = RacingChassis()
super.init()
}
override func chassis() -> Chassis {
return _racingChassis
}
}
चर का उपयोग करके एपीआई को डिज़ाइन करने का एक और उदाहरण तब होता है जब आपके पास प्रोटोकॉल में चर होते हैं। यदि आप अपने द्वारा किए जा सकने वाले एक्सटेंशन में सभी प्रोटोकॉल फ़ंक्शंस को तोड़ना चाहते हैं, तो संग्रहीत संपत्तियों को एक्सटेंशन में नहीं रखा जा सकता है और उन्हें क्लास में परिभाषित किया जाना है (इसे संकलित करने के लिए आपको कोड को असहज करना होगा; AdaptableViewController वर्ग और विस्तार से मोड चर निकालें):
protocol Adaptable {
var mode: Int { get set }
func adapt()
}
class AdaptableViewController: UIViewController {
// var mode = 0
}
extension AdaptableViewController: Adaptable {
var mode = 0 // compiler error
func adapt() {
//TODO: add adapt code
}
}
उपरोक्त कोड में यह संकलक त्रुटि होगी: "एक्सटेंशन में संग्रहीत गुण नहीं हो सकते हैं"। यहां बताया गया है कि आप ऊपर दिए गए उदाहरण को फिर से कैसे लिख सकते हैं ताकि प्रोटोकॉल में सब कुछ अलग-अलग किया जा सकता है इसके बजाय फ़ंक्शन का उपयोग करके:
protocol Adaptable {
func mode() -> Int
func adapt()
}
class AdaptableViewController: UIViewController {
}
extension AdaptableViewController: Adaptable {
func mode() -> Int {
return 0
}
func adapt() {
// adapt code
}
}
strong
संपत्ति के साथ एक उद्देश्य-सी वर्ग है और मुझे इसे ओवरराइड करने की कोशिश में एक त्रुटि मिल रही थी - लेकिन ऐसा लगता है कि मुझे याद आया कि यह "अनुमानित रूप से अलिखित वैकल्पिक" (chassis!
) में अनुवाद करता है। स्विफ्ट, इसलिएoverride var chassis : Chassis!
इसे ठीक करता है।