2015-03-07 13 views
17

क्यों मैं एक [AnyObject] सरणी है और उस में विभिन्न प्रकार के आकार का एक समूह डाल सकते हैं ...पूर्णांक किसी भी ऑब्जेक्ट प्रोटोकॉल के अनुरूप क्यों नहीं होते?

var a = [AnyObject]() 
a.append(Int(1)) 
a.append(Float64(3.14)) 
a.append(Bool(true)) 

... Int32 और Int64 ....

a.append(Int32(1)) // err: type 'Int32' does not conform to protocol 'AnyObject' 
a.append(Int64(1)) // err: type 'Int64' does not conform to protocol 'AnyObject' 

प्रलेखन के अलावा AnyObject कहते हैं के लिए:

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

लेकिन जब मैं इन प्रकार के मानक पुस्तकालय परिभाषा को देखने के लिए Int, Int32 या Int64 पर आदेश-क्लिक करें, मुझे लगता है कि वे सब struct मान रहे हैं।

अंतर्निहित मुद्दा क्या है? यह इस तरह क्यों डिजाइन किया गया है?

उत्तर

24

स्विफ्ट - Any में दो प्रकार के कुछ प्रकार हैं, जो वास्तव में कुछ भी हो सकते हैं - एक संरचना, enum या वर्ग, और AnyObject, जो केवल कक्षाएं पकड़ सकता है।

ऐसा लगता है कि AnyObject ऐसा क्यों लगता है कि कभी-कभी structs धारण कर सकते हैं कि उद्देश्य-सी इंटरऑप कम दर्दनाक बनाने के लिए कुछ विशिष्ट प्रकारों को आपके लिए अनिवार्य रूप से आपके एनएसईक्वाइवलेंट में परिवर्तित कर दिया जाता है।

एक AnyObject में एक Int नहीं वास्तव में डाल जब आप let ao: AnyObject = Int(1) लिखते हैं, यह है। इसके बजाए, यह आपके Int को NSNumber में परिवर्तित कर रहा है, जो कि एक वर्ग है, और उसके बाद उसे

लेकिन केवल कुछ प्रकारों में यह अंतर्निहित रूपांतरण है। Int करता है, लेकिन Int32, इसलिए इस व्यवहार नहीं करता है:

// fine 
let aoInt: AnyObject = Int(1) as NSNumber 
// also fine: implicit conversion 
let aoImplicitInt: AnyObject = Int(1) 
// not fine: error: 'Int32' is not convertible to 'NSNumber' 
let aoInt32: AnyObject = Int32(1) as NSNumber 
// but the implicit error is less, ahem, explicit 
// error: type 'Int32' does not conform to protocol 'AnyObject' 
let aoImplicitInt32: AnyObject = Int32(1) 

यह तर्क दिया जा सकता है वहाँ के पहियों तेल के लिए और अधिक अंतर्निहित रूपांतरण होना चाहिए, लेकिन उसके बाद फिर से, इन निहित रूपांतरण काफी भ्रम की स्थिति के स्रोत पहले से ही कर रहे हैं और नवीनतम बीटा में दिशा अधिक से अधिक उनमें से कम है।

+0

धन्यवाद यह एक है में एक संकर है उत्कृष्ट उत्तर क्या आपको पता है कि स्विफ्ट करता है कि किस तरह के निहित रूपांतरणों के बारे में कोई दस्तावेज है? मुझे लगता है कि यह सिर्फ 'एनएसआईएनटेगर' से परे है। –

+0

यूप, यह [कोको और उद्देश्य-सी के साथ स्विफ्ट का उपयोग करके] में शामिल है (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/ यूआईडी/टीपी 40014216-सीएच 6-एक्सआईडी_42) आईबुक। लेकिन बस ध्यान रखें कि यह एक्सकोड 6.3 बीटा में बदल गया है और पुस्तक केवल रिलीज़ संस्करण व्यवहार को प्रतिबिंबित करती है, इसलिए जब आप अपग्रेड करने का प्रयास करते हैं तो एक्सकोड रिलीज नोट्स को जांचना सबसे अच्छा होता है। –

+0

बीटीडब्ल्यू आप एनएसएनंबर का मतलब है और एनएसआईएनटेगर नहीं मानते हैं? –

0

प्रोटोकॉल जो इंट एट अल को देता है यह क्षमता _ObjectiveCBridgeable है, जो you can adopt yourself यदि आप साहसी महसूस करते हैं।

+0

यह टिप्पणी – ketan

+0

अपर्याप्त प्रतिष्ठा होना चाहिए। इसके अलावा, ऐसा लगता है कि यह प्रश्न संख्या का जवाब देता है? – user2488730

0

क्योंकि इंट एक मान प्रकार है।

AnyObjectसन्दर्भ प्रकार को संदर्भित करता है (वर्ग) नहीं मूल्य प्रकार

किसी भी संदर्भित करता है सन्दर्भ प्रकार + मूल्य प्रकार (structs + वर्ग)

आप किसी भी उपयोग करना चाहिए करने के लिए ValueTypes के लिए, AnyObject

मूल्य प्रकार> आम तौर पर structs, enums, ब्ला ब्ला ..

सन्दर्भ प्रकार> आम तौर पर कक्षाएं

वहाँ चर> सन्दर्भ प्रकार और मूल्य प्रकार के दो प्रकार हैं

सन्दर्भ प्रकार सूचक प्रकार के होते हैं और आम तौर पर जहां मूल डेटा संग्रहीत किया जाता है एक राम का पता मान

मूल्य प्रकार पते नहीं हैं। वे सीधे चर मूल्य

इंट asd = 3

इंट, फ्लोट, संख्या प्रकार (एएसडी सीधे 3 शामिल हैं) होते हैं, ... तिथि लगभग हमेशा (मान प्रकार) सबसे कंप्यूटर भाषाओं में struct कर रहे हैं।

स्ट्रिंग लगभग हमेशा सबसे कंप्यूटर भाषाओं

ViewControllers, दृश्य, बटन, ... सरणियों, शब्दकोशों, ... और अपने कस्टम परिभाषित वर्गों सन्दर्भ प्रकार के होते हैं

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