2014-09-12 11 views
63

मुझे समझ में नहीं आता कि किसी भी ऑब्जेक्ट का उपयोग कब करें और जब उपयोगकर्ता को स्विफ्ट में कोई भी कब उपयोग करें।स्विफ्ट में कोई भी ऑब्जेक्ट और कोई भी

मेरे मामले में, मैं एक शब्दकोश है

[स्ट्रिंग: ???]

??? : इंट, डबल, फ्लोट, स्ट्रिंग, सरणी, शब्दकोश

हो सकता है

कोई मुझे किसी भी और AnyObject और चुड़ैल एक के बीच का अंतर मेरे मामले में उपयोग करने के लिए व्याख्या कर सकते हैं।

Alak

उत्तर

76

AnyObject, केवल संदर्भ के प्रकार (वर्ग) के लिए है Any दोनों मूल्य और संदर्भ प्रकार के लिए है।

तो आपको [String: Any] के लिए जाना चाहिए।

  • Any बिल्कुल किसी भी प्रकार का एक उदाहरण का प्रतिनिधित्व कर सकते हैं, समारोह प्रकार सहित: किसी भी के लिए

    प्रकार कास्टिंग और AnyObject

    स्विफ्ट अविशिष्ट प्रकार के साथ काम करने के लिए दो विशेष प्रकार प्रदान करता है ।

  • AnyObject किसी भी वर्ग प्रकार के उदाहरण का प्रतिनिधित्व कर सकते हैं।

नोट:

उपयोग Any और AnyObject केवल आप स्पष्ट रूप से व्यवहार और क्षमताओं वे प्रदान की जरूरत है। के बारे में विशिष्ट होना हमेशा बेहतर होता है, जिन प्रकार आप अपने कोड में काम करने की उम्मीद करते हैं।

से स्विफ्ट प्रोग्रामिंग भाषा: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

यह भी ध्यान रखें कि जब आप कोको एपीआई के साथ काम करते हैं, यह AnyObject की किसी सरणी प्राप्त करने के लिए एक आम बात है, इस वजह से ऑब्जेक्टिव-सी सरणी टाइप नहीं हैं। तो आपको उन्हें आवश्यक सरणी प्रकार में डालने की आवश्यकता है।

-

संपादित करें: (दिसंबर 22, 2015)
पिछले बयान पर, ध्यान दें कि यह स्विफ्ट 2.0 और Xcode 7.
एप्पल तो बहुत सारे ऑब्जेक्टिव-सी में ‘Lightweight’ generics शुरू की है के साथ बदल रहा है कोको एपीआई का अब पहले से ही सही प्रकार देता है।

संपादित करें: (अक्टूबर 18, 2016)
ध्यान दें कि, स्विफ्ट 3.0 के रूप में, ऑब्जेक्टिव-सी id रों अब Any के रूप में, AnyObject के रूप में आयात किया जाता है अब और नहीं।

+11

ध्यान दें कि 'स्ट्रिंग',' ऐरे 'और' डिक्शनरी 'कक्षाएं नहीं हैं, इन उपयोगों के लिए कोई भी। – zaph

+3

न ही इंट, डबल और फ्लोट हैं। – Teejay

+8

हाँ लेकिन यह आमतौर पर स्पष्ट है। यह इतना स्पष्ट नहीं है कि 'एनएसएसटींग',' एनएसएआरएआरई 'और' एनएस डिक्शनरी 'कक्षाएं हैं, फिर भी इसी तरह के कार्यात्मक स्विफ्ट संस्करण कक्षाएं नहीं हैं और यह कई देवताओं की यात्रा करता है। – zaph

29

चाहे आप का उपयोग Any या AnyObject आपके इच्छित उपयोग पर निर्भर करता है:

अपने शब्दकोश केवल स्विफ्ट कोड के भीतर का उपयोग किया जाएगा, तो आप Any का उपयोग करना चाहिए, क्योंकि आपके प्रकार (Int, Double, Float , String, Array, और Dictionary) ऑब्जेक्ट्स नहीं हैं।

यदि आप ऑब्जेक्टिव-सी रूटीन में अपना शब्दकोश पास करेंगे जो NSDictionary की अपेक्षा करता है, तो आपको AnyObject का उपयोग करना चाहिए।

जब आप import Foundation या import UIKit या import Cocoa, यह [String: AnyObject] के रूप में अपने सरणी घोषित करने के लिए संभव है, लेकिन इस मामले में स्विफ्ट NSString के रूप में, NSNumber के रूप में अपने Int, Double, Float शाब्दिक इलाज है अपने String रों, NSArray के रूप में अपने Array रों , और आपके शब्दकोश NSDictionary के रूप में, जिनमें से सभी वस्तुएं हैं। AnyObject का उपयोग करके एक शब्दकोष मान प्रकार के रूप में परिवर्तनीय है NSDictionary, लेकिन Any का उपयोग करने वाला कोई नहीं है।

0

जेनिक्स सुरक्षित प्रकार हैं, जिसका अर्थ है कि यदि आप एक सामान्य के रूप में एक स्ट्रिंग पास करते हैं और एक पूर्णांक के रूप में उपयोग करने का प्रयास करते हैं तो संकलक शिकायत करेगा और आप अपना (जो अच्छा है) संकलित नहीं कर पाएंगे। (यह इसलिए होता है क्योंकि स्विफ्ट स्टेटिक टाइपिंग उपयोग कर रहा है, और आप एक संकलक त्रुटि देने में सक्षम है) आप AnyObject संकलक पता नहीं है इस वस्तु एक स्ट्रिंग के रूप में या एक पूर्णांक के रूप में इलाज किया जा सकता है का उपयोग करते हैं

और मूल रूप से की अनुमति देगा आप जो कुछ भी चाहते हैं उसे करने के लिए (जो खराब है) जैसे कि आप एक ऑब्जेक्ट का उपयोग करने का प्रयास करते हैं जो एक स्ट्रिंग के रूप में पारित किया गया है जब यह एक इंटीजर है तो एप्लिकेशन क्रैश हो जाएगा। (ऐसा इसलिए होता है क्योंकि स्विफ्ट डायनामिक टाइपिंग का उपयोग कर रहा है और केवल आपको रनटाइम त्रुटि देगा)

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