मुझे लगता है कि स्विफ्ट टीम द्वारा एक देव मंच पोस्ट किया गया है कि दूसरे उदाहरण के लिए शॉर्टेंड के रूप में दूसरा उदाहरण देने में सक्षम होना कितना अच्छा होगा।हालांकि, मुझे लगता है कि यह वास्तव में एक सामान्य कार्य होगा - एक घोषित करने के लिए सिर्फ एक शॉर्टेंड?
यह अलग कैसे होगा? जैसा कि अन्य उत्तरों ने इंगित किया है, Equatable
केवल सामान्य रूप से उपयोग किया जा सकता है। लेकिन चलो एक उदाहरण लें जो होना जरूरी नहीं है। कैसे यह है:
इस से
func f<T: Printable>(t: T) {
// do some stuff
}
अलग:
func g(p: Printable) {
// do some stuff
}
अंतर है, f
कार्यों के एक परिवार है कि संकलन समय पर उत्पन्न कर रहे हैं परिभाषित करता है, जो कुछ के साथ क्या t
के रूप में पारित हो जाता है के प्रकार T
के लिए प्रतिस्थापित। * तो यदि आप Int
में पास हुए हैं, तो ऐसा होगा कि आपने एक संस्करण func f(t: Int) { … }
लिखा होगा। यदि आप एक Double
में पारित कर दिया है, यह func f(t: Double) { … }
लेखन जैसा होगा * इस एक से अधिक सरलीकरण है, लेकिन अब के लिए इसके साथ जाना ...
दूसरी ओर, g
केवल एक ही समारोह, उस पर है रनटाइम केवल Printable
प्रोटोकॉल का संदर्भ स्वीकार कर सकता है।
अभ्यास में मतभेद लगभग अपरिहार्य हैं। उदाहरण के लिए, यदि आप किसी अन्य समारोह के लिए f
अंदर t
पारित यह इस तरह काम करता है:
func f(i: Int) {
// h doesn’t receive an Int
// but a Printable:
h(i as Printable)
}
उदाहरण के लिए
तो:
func f<T: Printable>(t: T) {
println(sizeof(t))
}
f(1 as Int8) // prints 1
f(1 as Int64) // prints 8
:
func h(i: Int) {
println("An Int!")
}
func h(p: Printable) {
println("A Printable!")
}
func f<T: Printable>(t: T) {
h(t)
}
h(1) // prints "An Int!"
f(1) // prints "A Printable!"
आप थोड़ा तरीके में अंतर है, हालांकि देख सकते हैं
सबसे बड़ा अंतर यह है कि वे वास्तविक जेनेरिक प्रकार को प्रोटोकॉल नहीं लौटा सकते हैं:
func f<T: Printable>(t: T) -> T {
return t
}
func g(p: Printable) -> Printable {
return p
}
let a = f(1) // a is an Int
let b = f([1]) // b is an [Int]
let c = g(1) // c is a Printable
let d = g([1]) // d is a Printable
यह अंतिम उदाहरण यह समझने की कुंजी है कि संबंधित प्रकारों के प्रोटोकॉल का उपयोग केवल सामान्य रूप से क्यों किया जा सकता है। आप first
का अपना स्वयं का कार्यान्वयन करना चाहता था मान लीजिए:
func first<C: CollectionType>(x: C) -> C.Generator.Element? {
if x.startIndex != x.endIndex {
return x[x.startIndex]
}
else {
return nil
}
}
तो first
एक सामान्य समारोह, और सिर्फ एक नियमित रूप से समारोह है कि एक CollectionType
प्रोटोकॉल का एक तर्क प्राप्त नहीं था, कैसे यह क्या भिन्नता है संभव हो जाएगा यह लौटा हुआ?
आपका दूसरा स्निपेट संकलित नहीं हो रहा है, यह प्रोटोकॉल फेंकता है Equatable केवल सामान्य बाधा 'कंपाइलर त्रुटि के रूप में उपयोग किया जा सकता है। खैर, संकलन करने में सक्षम होना काफी लाभ है, है ना? ;) – siejkowski
मुझे लगता है कि यह एक उत्कृष्ट प्रश्न है जो गहरे मुद्दों पर पड़ता है। हां, दूसरा स्निपेट संकलित नहीं है। क्यों नहीं? संकलक इसे संकलित क्यों नहीं कर सकता? वह भाषा उस तरह क्यों काम करती है? – algal