2014-09-19 9 views
6
@IBAction func helloClick(sender: AnyObject) { 

    sender.setTitle("Click", forState: UIControlState.Normal) 

} 

उपरोक्त कोड ठीक काम करता है। लेकिन setTitleAnyObject पर कोई विधि नहीं है? यह संकलन समय त्रुटि नहीं होनी चाहिए?स्विफ्ट ने मुझे AnyObject पर setTitle क्यों कॉल करने दिया?

उत्तर

4

इस भाषा विवरण के एक हिस्से (id compatibility पर अनुभाग देखें)

आप किसी भी ऑब्जेक्टिव-सी विधि कॉल और किसी भी संपत्ति का उपयोग (AnyObject पर) कर सकते हैं एक और अधिक विशिष्ट वर्ग प्रकार के कास्टिंग के बिना है।

यह आसान उद्देश्य-सी इंटरऑप के लिए अनुमति देने के लिए है।

गाइड भी निम्न राज्यों:

हालांकि, क्योंकि एक वस्तु के रूप में AnyObject टाइप की विशिष्ट प्रकार क्रम तक ज्ञात नहीं है, यह संभव है अनजाने असुरक्षित कोड लिखने के लिए।

जाहिर है क्योंकि आपके कोड की वैधता केवल रनटाइम पर निर्धारित होती है, यह असुरक्षित हो सकती है।

+0

कंपाइलर जानता है कि उदाहरण के लिए 'setTitle2' मौजूद नहीं है और यह इसे संकलित नहीं करेगा। तो यह मुझे असुरक्षित कोड लिखने नहीं देगा। –

+0

बेशक यह आपको असुरक्षित कोड लिखने देगा। यह आपको '(NSArray() को AnyObject के रूप में लिखने देगा) .setTitle (" foo ", forState: Normal) 'जो लगभग निश्चित रूप से क्रैश होगा। इसी प्रकार, अपना उदाहरण कोड दिया गया है, यह आपको 'हैलोक्लिक (एनएसएआरएआरए())' कहने देगा, जिसका एक समान प्रभाव होगा। जब भी आप AnyObject का उपयोग करते हैं तो यह असुरक्षित होता है, जब तक कि आप हमेशा बीमा न करें कि आपका प्रस्तावित ऑपरेशन सुरक्षित है। आम तौर पर इसे उचित रूप से कुछ और विशिष्ट टाइप करने के द्वारा। –

+2

@IanWarburton: आप किसी भी विधि का नाम कह सकते हैं जहां संकलक को दिखाई देने वाले नाम के साथ '@ objc' विधि घोषणा थी। आपने विधि नाम 'setTitle:' विधि के साथ एक एपीआई आयात किया है, लेकिन इसने कभी भी किसी विधि को 'setTitle2:' विधि के साथ नहीं देखा है। यदि आपने '@ objc' विधि के साथ एक वर्ग घोषित किया है जिसका नाम 'setTitle2:' है, तो हाँ, यह संकलित करेगा। – newacct

3

AnyObject ऑब्जेक्टिव-सी के id

की तरह ही व्यवहार करती है यह किसी भी विधि उस पर बुलाया जा सकता है। संकलन समय त्रुटियों को बाईपास करने के लिए AnyObjectका उद्देश्य है। आप AnyObject पर किसी भी विधि को कॉल कर सकते हैं और यह ठीक संकलित करेगा। आप केवल रनटाइम में त्रुटियां देखेंगे।

डॉक्स के अनुसार,

आप किसी भी ऑब्जेक्टिव-सी विधि कॉल और एक अधिक विशिष्ट वर्ग प्रकार के कास्टिंग के बिना किसी भी संपत्ति (AnyObject पर) का उपयोग कर सकते हैं।

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