2014-12-30 8 views
5

पर ओवरलोडेड विधियों को जोड़ने में विफल रहता है यदि किसी ऑब्जेक्टिव-सी क्लास में अधिभारित विधियों को जोड़ने के लिए स्विफ्ट एक्सटेंशन का उपयोग किया जाता है, तो ऐसा लगता है कि यह केवल पहली विधि को कॉल करता है, जो अप्रत्याशित व्यवहार या रनटाइम पर क्रैश उत्पन्न करता है। एक स्विफ्ट क्लास पर एक एक्सटेंशन (उद्देश्य-सी के विपरीत) सही तरीके से काम करता है। मैं यह स्थापित करना चाहता हूं कि इसमें कोई कामकाज है और पुष्टि करें कि यह एक बग है जिसे मुझे ऐप्पल को रिपोर्ट करनी चाहिए। यह देखते हुए कि उद्देश्य-सी अधिभारित तरीकों का समर्थन नहीं करता है जबकि स्विफ्ट करता है, मैं कल्पना कर सकता हूं कि दोनों मिश्रण करना समस्याओं के लिए नुस्खा है।स्विफ्ट एक्सटेंशन ऑब्जेक्टिव-सी क्लास

ऑब्जेक्टिव-सी क्लास को एक इनिट फ़ंक्शन रखने के अलावा एक्सटेंशन प्राप्त करने वाले वर्ग खाली हैं। 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) 
+0

मैंने ऐप्पल को इसकी सूचना दी और यह एक्सकोड – brunobowden

उत्तर

7

ओबीजेसी विधि ओवरलोडिंग का समर्थन नहीं करता है। जब आप ओबीजेसी कक्षा का विस्तार करते हैं, तो आपके कोड का इंटरफ़ेस ओबीजेसी रनटाइम होता है-भले ही आप उस स्विफ्ट कोड को अन्य स्विफ्ट कोड से कॉल कर रहे हों- इसलिए आपकी कक्षा का इंटरफ़ेस स्विफ्ट की सुविधाओं का उपयोग नहीं कर सकता है जो नहीं हैं ओबीजेसी में भी मौजूद है।

जैसा कि आपने देखा है, यह शायद संकलन त्रुटि होनी चाहिए। मैं filing a bug about that की सिफारिश करता हूं, खासकर जब से आप पहले से ही एक आसान परीक्षण केस डाल चुके हैं।

+0

में तय किया गया था, मैंने बग की सूचना दी है और क्रिस लैटनर को ईमेल किया है। मुझे पता था कि उद्देश्य-सी अधिभारित संदेशों का समर्थन नहीं करता है - मुझे यह पूछना चाहिए कि पूछते समय। – brunobowden

+0

मैंने ऐप्पल को इसकी सूचना दी और यह एक्सकोड में तय किया गया था – brunobowden

संबंधित मुद्दे