AnyObject और स्विफ्ट में कोई भी


92

मुझे समझ नहीं आ रहा है कि AnyObject का उपयोग कब करें और स्विफ्ट में Any का उपयोग कब करें।

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

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

??? : इंट, डबल, फ्लोट, स्ट्रिंग, एरे, डिक्शनरी हो सकता है

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

Alak

जवाबों:


116

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

इसलिए आपको जाना चाहिए [String: Any]

किसी और AnyObject के लिए कास्टिंग टाइप करें

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

  • Any फ़ंक्शन प्रकारों सहित, किसी भी प्रकार की एक आवृत्ति का प्रतिनिधित्व कर सकता है।
  • 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 का एक सरणी प्राप्त करना सामान्य है, इसका कारण यह है कि उद्देश्य-सी सरणियों को टाइप नहीं किया जाता है। इसलिए आपको उन्हें उस सरणी प्रकार में डालना होगा जो आप अपेक्षा करते हैं।

-

EDIT: (दिसंबर 22, 2015)
अंतिम कथन पर, ध्यान दें कि यह स्विफ्ट 2.0 और Xcode 7 के साथ बदल रहा है।
Apple ने ऑब्जेक्टिव-सी में 'लाइटवेट' जेनेरिक को पेश किया है, इसलिए बहुत सारे कोको एपीआई अब पहले से ही सही प्रकार लौटाते हैं।

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


18
ध्यान दें कि String, Arrayऔर Dictionaryइन वर्गों के लिए कोई उपयोग नहीं हैं।
जफ

6
न ही इंट, डबल और फ्लोट हैं।
तीजय

12
हाँ, लेकिन यह आमतौर पर स्पष्ट है। यह इतना स्पष्ट नहीं है कि NSString, NSArrayऔर NSDictionaryकक्षाएं अभी तक समान रूप से कार्यात्मक स्विफ्ट संस्करण कक्षाएं नहीं हैं और जो कई देवों की यात्राएं करती हैं।
ज़ाफ़

1
क्या कोई भी वैकल्पिक का प्रतिनिधित्व करता है? या कि किसी के रूप में व्यक्त किया जाना चाहिए?

1
@robdashnash कोई भी वैकल्पिक का प्रतिनिधित्व नहीं करता है। ? इसे वैकल्पिक बनाने के लिए जोड़ा जाना चाहिए
क्रिप्ट

47

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

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

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

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


1

Apple के स्विफ्ट डॉक्यूमेंट के अनुसार,

  • कोई भी किसी भी प्रकार का उदाहरण प्रस्तुत कर सकता है, जिसमें फ़ंक्शन प्रकार और वैकल्पिक प्रकार शामिल हैं।
  • AnyObject किसी भी वर्ग प्रकार के उदाहरण का प्रतिनिधित्व कर सकता है।

अधिक जानकारी के लिए कृपया इसे देखें: ब्लॉग


1

इस SO उत्तर की जाँच करें :

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.