मैं क्यों जहां एक सामान्य विधि के खंड नजरअंदाज कर दिया हैगलत सामान्य अधिभार समारोह
मैं स्विफ्ट 3 में एक साधारण उपयोग के मामले (यदि आप एक खेल का मैदान है, तो आप में कोड कॉपी कर सकते हैं बनाया है समझने की कोशिश कर रहा हूँ बुलाया इसके साथ झुकाव करना चाहते हैं):
//MARK: - Classes
protocol HasChildren {
var children:[Human] {get}
}
class Human {}
class SeniorHuman : Human, HasChildren {
var children: [Human] {
return [AdultHuman(), AdultHuman()]
}
}
class AdultHuman : Human, HasChildren {
var children: [Human] {
return [YoungHuman(), YoungHuman(), YoungHuman()]
}
}
class YoungHuman : Human {}
//MARK: - Generic Methods
/// This method should only be called for YoungHuman
func sayHelloToFamily<T: Human>(of human:T) {
print("Hello \(human). You have no children. But do you conform to protocol? \(human is HasChildren)")
}
/// This method should be called for SeniorHuman and AdultHuman, but not for YoungHuman...
func sayHelloToFamily<T: Human>(of human:T) where T: HasChildren {
print("Hello \(human). You have \(human.children.count) children, good for you!")
}
ठीक है, तो अब कुछ परीक्षण चलाएं। अगर हमने:
let senior = SeniorHuman()
let adult = AdultHuman()
print("Test #1")
sayHelloToFamily(of: senior)
print("Test #2")
sayHelloToFamily(of: adult)
if let seniorFirstChildren = senior.children.first {
print("Test #3")
sayHelloToFamily(of: seniorFirstChildren)
print("Test #4")
sayHelloToFamily(of: seniorFirstChildren as! AdultHuman)
}
उत्पादन होता है:
Test #1
Hello SeniorHuman. You have 2 children, good for you!
Test #2
Hello AdultHuman. You have 3 children, good for you!
Test #3
Hello AdultHuman. You have no children. But do you conform to protocol? true
//Well, why are you not calling the other method then?
Test #4
Hello AdultHuman. You have 3 children, good for you!
//Oh... it's working here... It seems that I just can't use supertyping
खैर ... जाहिरा तौर पर, where
प्रोटोकॉल खंड काम करने के लिए, हम एक मजबूत प्रकार है कि में प्रोटोकॉल के अनुरूप है पारित करने के लिए की जरूरत है अपने परिभाषा।
बस सुपरर्टिंग का उपयोग करना पर्याप्त नहीं है, भले ही यह परीक्षण # 3 में स्पष्ट है कि दिया गया उदाहरण वास्तव में HasChildren
प्रोटोकॉल के अनुरूप है।
तो, मैं यहां क्या खो रहा हूं, क्या यह संभव नहीं है? क्या आपके पास कुछ लिंक हैं जो हो रहा है, या where
क्लॉज, या सबटाइपिंग और सामान्य रूप से इसके व्यवहार के बारे में अधिक जानकारी दे रहे हैं?
मैं कुछ उपयोगी संसाधनों पढ़ा है, लेकिन कोई भी कारण है कि यह काम नहीं कर रहा बारे में एक विस्तृत विवरण के लिए लगता है:
अच्छा, यह बहुत स्पष्ट है जब आप इसे इस तरह कहते हैं। विश्वास नहीं कर सकता कि मुझे याद आया ... मुझे लगता है कि रिकर्सिव जेनेरिक फ़ंक्शंस का मेरा विचार ठीक से काम नहीं करेगा, अगर हम उन्हें गतिशील नहीं बना सकते हैं। –