2015-04-01 14 views
8

मैं अपनी परियोजनाओं के लिए इस तरह की एक विधि बनाने के लिए करना चाहते हैं:AnyObject बनाम Struct (कोई भी)

func print(obj: AnyObject) { 
    if let rect = obj as? CGRect { 
     println(NSStringFromCGRect(rect)) 
    } 
    else if let size = obj as? CGSize { 
     println(NSStringFromCGSize(size)) 
    } 

    //... 
} 

लेकिन मैं नहीं कर सकता क्योंकि CGRect और CGSizestruct रों हैं और AnyObject के अनुरूप नहीं है । तो, इस पर कोई विचार कैसे किया जा सकता है?

उत्तर

5

@ nkukushkin का जवाब है सही, लेकिन, अगर क्या आप चाहते हैं एक समारोह है कि आधार पर अलग ढंग से व्यवहार करती है कि क्या यह पारित कर दिया है पर एक CGRect या एक CGStruct, आप अधिक भार के साथ बेहतर कर रहे हैं:

func print(rect: CGRect) { 
    println(NSStringFromCGRect(rect)) 
} 

func print(size: CGSize) { 
    println(NSStringFromCGSize(size)) 
} 

तुलनात्मक रूप से, Any दोनों अक्षम होंगे (आपके structs को Any पर वापस परिवर्तित कर सकते हैं और पीछे, यदि आप इसे कसकर लूप में बहुत कुछ करते हैं तो इसका बड़ा प्रभाव हो सकता है), और non-typesafe (y कहां उस समारोह में कुछ भी पास कर सकते हैं, और यह केवल रनटाइम पर असफल हो जाएगा)।

यदि आपका इरादा दोनों प्रकारों को एक सामान्य प्रकार में जोड़ना है और फिर उस पर एक ही ऑपरेशन करना है, तो आप उस प्रकार के तीसरे ओवरलोड को बना सकते हैं, और अन्य दो इसे कॉल कर सकते हैं।

+0

कि बहुत अच्छा है: उदाहरण के लिए, यदि आप println(aRect) उसी प्रारूप में के रूप में NSStringFromCGRect द्वारा दिया आप एक्सटेंशन का उपयोग कर सकता है चाहता था। किसी कारण से मैं पूरी तरह से विधि अधिभार के बारे में भूल गया .. –

9

AnyObject के बजाय Any का उपयोग करें।

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

AnyObject किसी भी वर्ग प्रकार का एक उदाहरण का प्रतिनिधित्व कर सकते हैं।
Any फ़ंक्शन प्रकारों सहित किसी भी प्रकार के किसी उदाहरण का प्रतिनिधित्व कर सकता है।

The Swift Programming Language

2

बस ऐसा करने का एक बेहतर तरीका खोजा गया। स्विफ्ट में डंप नामक एक विधि है, और यह कई प्रकार के डेटा के साथ काम करता है।

उदाहरण के लिए:

dump(CGRectMake(0, 5, 30, 60)) 

प्रिंट होगा:

{x 0 y 5 w 30 h 60} 
1

तुम सिर्फ एक CGRect या CGSize, आप इस्तेमाल कर सकते हैं मुद्रित करने के लिए की जरूरत है:

println(rect) 

या

println(size) 

आपने अपने फ़ंक्शन के अंत में '...' छोड़ा है, इसलिए मुझे लगता है कि प्रिंट करने के लिए आपको और अधिक प्रकार की आवश्यकता है। ऐसा करने के लिए आपको उन प्रकारों को Printable प्रोटोकॉल के अनुरूप बनाने की आवश्यकता है (जब तक वे पहले से ही नहीं करते)।आप जिस तरह से एक प्रकार वर्तमान में छपा है का स्वरूप बदलने के लिए चाहते हो सकता है

let myCar = Car() 
println(myCar) 

इसके अलावा,:

class Car { 
    var mileage = 0 
} 

extension Car : Printable { 
    var description: String { 
     return "A car that has travelled \(mileage) miles." 
    } 
} 

, जिसे आप उपयोग कर सकते हैं - यहाँ है कैसे का एक उदाहरण है।

extension CGRect : Printable { 
    public var description: String { 
     return "{\(origin.x), \(origin.y)}, {\(size.width), \(size.height)}" 
    } 
} 
+0

हाँ, यह सच है। लेकिन मुझे लगता है कि "डंप" और "NSStringFromCGRect" एक प्रारूप बनाता है जो पढ़ने में आसान है। तुम जानते हो क्यों? –

+0

क्या आप अपने कोड का परीक्षण करने के लिए खेल के मैदान का उपयोग कर रहे हैं? मेरा मानना ​​है कि आपका कोड 'डंप (सीजीआरईटीएमके (0, 5, 30, 60)) वास्तव में आपको खेल के मैदान से' सीजीईजीईटी 'का पूर्वावलोकन दिखा रहा है। कोड का प्रयास करें 'rect = cGRect (x: 0, y: 5, चौड़ाई: 30, ऊंचाई: 60); डंप (आयत) 'और आपको' println (rect) 'के समान प्रारूप प्राप्त करना चाहिए। – ABakerSmith

+0

मैंने 'println' का उपयोग करते समय प्रारूप को बदलने के तरीके के बारे में बात करने के लिए अपना उत्तर अपडेट कर दिया है। – ABakerSmith

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