पर ओवरलोडेड विधियों को जोड़ने में विफल रहता है यदि किसी ऑब्जेक्टिव-सी क्लास में अधिभारित विधियों को जोड़ने के लिए स्विफ्ट एक्सटेंशन का उपयोग किया जाता है, तो ऐसा लगता है कि यह केवल पहली विधि को कॉल करता है, जो अप्रत्याशित व्यवहार या रनटाइम पर क्रैश उत्पन्न करता है। एक स्विफ्ट क्लास पर एक एक्सटेंशन (उद्देश्य-सी के विपरीत) सही तरीके से काम करता है। मैं यह स्थापित करना चाहता हूं कि इसमें कोई कामकाज है और पुष्टि करें कि यह एक बग है जिसे मुझे ऐप्पल को रिपोर्ट करनी चाहिए। यह देखते हुए कि उद्देश्य-सी अधिभारित तरीकों का समर्थन नहीं करता है जबकि स्विफ्ट करता है, मैं कल्पना कर सकता हूं कि दोनों मिश्रण करना समस्याओं के लिए नुस्खा है।स्विफ्ट एक्सटेंशन ऑब्जेक्टिव-सी क्लास
ऑब्जेक्टिव-सी क्लास को एक इनिट फ़ंक्शन रखने के अलावा एक्सटेंशन प्राप्त करने वाले वर्ग खाली हैं। ObjClass को .h और .m फ़ाइलों के भीतर घोषित किया गया है और स्विफ्ट ब्रिजिंग हेडर का उपयोग करके आयात किया गया है। मूल SwiftClass स्विफ्ट एक्सटेंशन के साथ कोड नमूना भीतर परिभाषित किया गया है:
extension ObjClass {
func log(param: Int32) { NSLog("ObjClass->Int32: " + String(param)) }
func log(param: String) { NSLog("ObjClass->String: " + param) }
func log(param: ObjClass) { NSLog("ObjClass->ObjClass") }
}
class SwiftClass {
}
extension SwiftClass {
func log(param: Int32) { NSLog("SwiftClass->Int32: " + String(param)) }
func log(param: String) { NSLog("SwiftClass->String: " + param) }
func log(param: ObjClass) { NSLog("SwiftClass->ObjClass") }
}
अब फोन एक स्ट्रिंग, पूर्णांक और वस्तु के साथ अतिभारित विधि:
var objClass = ObjClass()
objClass.log(10)
objClass.log("string")
objClass.log(objClass)
var swiftClass = SwiftClass()
swiftClass.log(10)
swiftClass.log("string")
swiftClass.log(objClass)
ObjClass के लिए, सभी विधि कॉल कर रहे हैं Int32 प्रकार के साथ पहली विधि में बनाया गया। COpaquePointer के उपयोग के माध्यम से, मैं देख सकता हूं कि यह ऑब्जेक्ट पॉइंटर से संबंधित है लेकिन थोड़ा अलग है।
ObjClass->Int32: 10
ObjClass->Int32: 1881422800
ObjClass->Int32: 1879122512
स्विफ्ट एक्सटेंशन एक स्विफ्ट वर्ग पर अपेक्षा के अनुरूप काम करता है:
SwiftClass->Int32: 10
SwiftClass->String: string
SwiftClass->ObjClass
उम्मीद है कि इस कुछ बिंदु पर समर्थन किया जा सकता। तब तक, मेरा मानना है कि यह अप्रत्याशित व्यवहार या दुर्घटना देने के बजाय संकलन समय में विफल होना चाहिए। क्या किसी के पास इसका सुझाव देने के लिए कोई कामकाज है?
मैं जानता हूँ कि यह पहली विधि कॉल कर रहा है जैसे मैं ObjClass विस्तार तरीकों स्वैप, इसलिए जैसे:
extension ObjClass {
func log(param: String) { NSLog("ObjClass->String: " + param) }
func log(param: Int32) { NSLog("ObjClass->Int32: " + String(param)) }
func log(param: ObjClass) { NSLog("ObjClass->ObjClass") }
}
फिर objClass.log(str)
करने के लिए कॉल ठीक काम करता है लेकिन objClass.log(10)
करने के लिए कॉल का उत्पादन:
main(1): EXC_BAD_ACCESS (code=1, address=0xa)
मैंने ऐप्पल को इसकी सूचना दी और यह एक्सकोड – brunobowden