2014-06-07 6 views
32

में एक चर के प्रकार का निर्धारण कैसे करें स्विफ्ट में परिवर्तनीय प्रकार निर्धारित करने के लिए कोई फ़ंक्शन है? मुझे लगता है कि पाइथन में type() जैसा कुछ हो सकता है।स्विफ्ट

मुझे यह तय करने का कोई तरीका चाहिए कि एक चर एक फाउंडेशन ऑब्जेक्ट या स्विफ्ट में सी चर है। एनएसएसटींग बनाम स्ट्रिंग, या एनएसएआरएआर बनाम सरणी की तरह। ताकि मैं इसे कंसोल में लॉग आउट कर सकूं और स्पष्ट रूप से देख सकूं कि यह क्या है।

var array = [1,2,3] // by default NSArray or array? 
var array:[Int] = [1,2,3] 
var array:NSArray = [1,2,3] 
var array:Array<Any> = [1,2,3] 

मैं पहचानने अगर एक दिया चर का एक प्रकार दिया में प्रकार है के लिए उत्तर देखा है:

उदाहरण के लिए, मैं प्रकार पहले array नीचे लिए लगाए गए अनुमान जानना चाहते हैं this question, लेकिन मैं कहूंगा कि मैं जो पूछना चाहता हूं उससे काफी अलग है।

+0

ऐसा नहीं है कि मैं के बारे में पता है, लेकिन आप अपने खुद के नीचे रोल कर सकते हैं? –

+0

मैंने अपना कथन अधिक स्पष्ट करने के लिए प्रश्न संपादित किया है – piaChai

+0

क्या आप इस प्रकार के कोड का उदाहरण दे सकते हैं जहां आप इस ज्ञान का उपयोग करना चाहते हैं? यदि प्रकार संकलन-समय पर ज्ञात है, तो आप शायद एक सामान्य फ़ंक्शन का उपयोग कर सकते हैं, जैसे 'func show (x: T) {println ("\ (x) प्रकार \ (टी)"} 'है। यदि यह है संकलन समय के रूप में नहीं जाना जाता है, मुझे यकीन नहीं है कि यह भी संभव होगा, क्योंकि ऐसा लगता है कि सी मान में आवश्यक रनटाइम मेटाडेटा नहीं होगा। (दुख की बात है कि मैं इसे अपने लिए नहीं कर सकता क्योंकि ऐप्पल अभी भी ने मेरे डेवलपर खाते को मंजूरी नहीं दी है।) –

उत्तर

23

आप .dynamicType संपत्ति का उपयोग कर किसी मूल्य के प्रकार ऑब्जेक्ट का संदर्भ प्राप्त कर सकते हैं। यह पायथन के type() फ़ंक्शन के समतुल्य है, और इसका उल्लेख in the Swift documentation under Language Reference: Types: Metatype Type है।

var intArray = [1, 2, 3] 
let typeOfArray = intArray.dynamicType 

इस प्रकार के ऑब्जेक्ट के साथ, हम एक ही सरणी प्रकार का एक नया उदाहरण बनाने में सक्षम हैं।

var newArray = typeOfArray() 
newArray.append(5) 
newArray.append(6) 
println(newArray) 
[5, 6] 

हम देख सकते हैं कि इस नए मूल्य एक नाव संलग्न करने के लिए प्रयास करके एक ही प्रकार ([Int]) की है: यदि हम कोको आयात

newArray.append(1.5) 
error: type 'Int' does not conform to protocol 'FloatLiteralConvertible' 

और एक सरणी का उपयोग मिश्रित प्रकारों के साथ शाब्दिक, हम देख सकते हैं कि NSArray बनाया गया है:

import Cocoa 

var mixedArray = [1, "2"] 
let mixedArrayType = mixedArray.dynamicType 

var newArray = mixedArrayType() 
var mutableArray = newArray.mutableCopy() as NSMutableArray 

mutableArray.addObject(1) 
mutableArray.addObject(1.5) 
mutableArray.addObject("2") 

println(mutableArray) 
(1, "1.5", 2) 

हालांकि, इस बिंदु पर किसी प्रकार की ऑब्जेक्ट का स्ट्रिंग विवरण उत्पन्न करने का कोई सामान्य तरीका प्रतीत नहीं होता है, इसलिए यह आपके द्वारा पूछे जाने वाले डिबगिंग भूमिका की सेवा नहीं कर सकता है।

प्रकार NSObject से प्राप्त

println(mixedArrayType.description()) 
__NSArrayI 

हालांकि इस तरह के स्विफ्ट के अंतर्निहित सरणियों के रूप में प्रकार पर मौजूद नहीं है, एक .description() विधि है, के रूप में in SiLo's answer किया जाता है।

println(typeOfArray.description()) 
error: '[Int].Type' does not have a member named 'description' 
+0

बीटीडब्लू: 'ओबीजे के बजाए।विवरण() ', आप हमेशा 'स्ट्रिंग (ओबीजे)' का उपयोग कर सकते हैं (यदि यह उपलब्ध है तो यह विवरण का उपयोग करेगा)। – Tali

+2

। डायनामिक टाइप अब बहिष्कृत है। टाइपफ समकक्ष अब टाइप (के: myvariable) – logicor

+0

@logicor जानकारी के लिए धन्यवाद। इस पोस्ट में एक संपादन का सुझाव देना चाहते हैं (तो आपको अतिरिक्त के लिए क्रेडिट मिलेगा)? यदि नहीं, तो मैं इसे बाद में अपने आप संपादित कर दूंगा। –

0

मैं debuging दौरान breakpoints का उपयोग, लेकिन आप अगर वे रनटाइम के दौरान एक खास प्रकार से मेल की जाँच करने की आवश्यकता है तो drewag है सही

एक और बात आप कर सकते है दावे से परीक्षण डेटाप्रकार यह केवल डिबगिंग में लेकिन दावे से काम करेगा आप परिस्थितियों के सेट कर सकते हैं, तो मुलाकात अनुप्रयोग क्रैश हो

शायद की तरह assert(let tArray == oldArray as? NSArray[] //if not NSArray app crashes)

+0

यह जांच _if_ a var _specific_ प्रकार का है, _what_ टाइप करें _is_। आपके सहयोग के लिए धन्यवाद। –

10

कुछ यह ऐसा करने के लिए, हालांकि यह जरूरी है कि आसान है और न ही उपयोगी नहीं है संभव है:

func getClassName(obj : AnyObject) -> String 
{ 
    let objectClass : AnyClass! = object_getClass(obj) 
    let className = objectClass.description() 

    return className 
} 

let swiftArray = [1, 2, 3] 
let swiftDictionary = ["Name": "John Doe"] 
let cocoaArray : NSArray = [10, 20, 30] 
var mutableCocoaArray = NSMutableArray() 

println(getClassName(swiftArray)) 
println(getClassName(swiftDictionary)) 
println(getClassName(cocoaArray)) 
println(getClassName(mutableCocoaArray)) 

आउटपुट:

_TtCSs22ContiguousArrayStorage00007F88D052EF58 
__NSDictionaryM 
__NSArrayI 
__NSArrayM 

आप स्विफ्ट में is और as कीवर्ड का उपयोग करने के लिए बेहतर कर रहे हैं। कई नींव कक्षाएं एक स्विफ्ट Array<Int> का उपयोग करते समय swiftDictionaryNSMutableDictionary सामान्य रूप से करने के लिए वर्ग समूहों का उपयोग करें (आप के साथ __NSArrayI (अपरिवर्तनीय) और __NSArrayM (परिवर्तनशील) देख सकते हैं।

सूचना दिलचस्प व्यवहार। swiftArray चूक। इस तरह का साथ व्यवहार मैं वास्तव में कुछ भी एक निश्चित प्रकार किया जा रहा है पर भरोसा नहीं होता है (पहले की जाँच करें)।

+2

क्यों object_getClassName का उपयोग न करें? – Brian

20

विकल्प + चर आप जांच करना चाहते हैं पर क्लिक करें।

enter image description here

+0

यह एक्सकोड 9 में काम नहीं करता प्रतीत होता है। –

3

किसी के ऊपर इस उल्लेख किया है, लेकिन मैं इसे एक जवाब के बजाय एक टिप्पणी के रूप में दृश्यता के हकदार लगता है। अब आप बस (: ___ के): प्रकार का उपयोग कर सकते हैं

var red, green, blue: Double 
print(type(of: green)) 

पैदावार

डबल