2015-01-13 4 views
8

में कक्षा के सभी चरों को कैसे सूचीबद्ध करें स्विफ्ट में किसी वर्ग के सभी चर सूचीबद्ध करने का कोई तरीका है?स्विफ्ट

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

class foo { 
    var a:Int? = 1 
    var b:String? = "John" 
} 

मैं इस तरह यह सूचीबद्ध करना चाहते हैं: [a:1, b:"John"]

+0

काफी समान (डुप्लिकेट?) प्रश्न: [स्विफ्ट में वर्ग की संपत्तियों की सूची] (http://stackoverflow.com/questions/24844681/list-of-classs-properties-in-swift) –

+0

इस तरह: http://stackoverflow.com/questions/24844681/list -फ-क्लास-प्रॉपर्टी-इन-स्विफ्ट? ओह - ऐसा लगता है :-) –

+0

मैंने कोशिश की लेकिन यह मेरे लिए काम नहीं किया, मेरे मामले में मुझे गुणों को चर नहीं प्राप्त करने की आवश्यकता है। –

उत्तर

7

निम्नलिखित प्रतिबिंब का उपयोग सदस्यों और मानों की सूची उत्पन्न करने के लिए करना चाहिए। पर http://swiftstub.com/836291913/

class foo { 
    var a:Int? = 1 
    var b:String? = "John" 
} 
let obj = foo() 
let reflected = reflect(obj) 
var members = [String: String]() 
for index in 0..<reflected.count { 
    members[reflected[index].0] = reflected[index].1.summary 
} 
println(members) 

आउटपुट बेला देखें:

[b: John, a: 1] 
+0

यह उत्तर http://stackoverflow.com/a/24069875/1187415 में https://gist.github.com/mchambers/67640d9c3e2bcffbb1e2 के लिंक के साथ एक टिप्पणी है, जहां (यदि मैं इसे सही ढंग से समझें) वास्तविक मान पुनर्प्राप्त किए जाते हैं और न केवल स्ट्रिंग विवरण। –

+0

मुझे यही चाहिए, जेसन धन्यवाद! –

+1

उसे नहीं पता था। धन्यवाद! यदि '0 में इंडेक्स के लिए लिखा गया है तो आपके 'के लिए' अधिक 'स्विफ्ट' होगा ..

7

आप स्विफ्ट 3.0 रिकर्सिवली में कर सकते हैं कैसे:

import Foundation 

class FirstClass { 
    var name = "" 
    var last_name = "" 
    var age = 0 
    var other = "abc" 

    func listPropertiesWithValues(reflect: Mirror? = nil) { 
     let mirror = reflect ?? Mirror(reflecting: self) 
     if mirror.superclassMirror != nil { 
      self.listPropertiesWithValues(reflect: mirror.superclassMirror) 
     } 

     for (index, attr) in mirror.children.enumerated() { 
      if let property_name = attr.label as String! { 
       //You can represent the results however you want here!!! 
       print("\(mirror.description) \(index): \(property_name) = \(attr.value)") 
      } 
     } 
    } 

} 


class SecondClass: FirstClass { 
    var yetAnother = "YetAnother" 
} 

var second = SecondClass() 
second.name = "Name" 
second.last_name = "Last Name" 
second.age = 20 

second.listPropertiesWithValues() 

परिणाम:

Mirror for FirstClass 0: name = Name 
Mirror for FirstClass 1: last_name = Last Name 
Mirror for FirstClass 2: age = 20 
Mirror for FirstClass 3: other = abc 
Mirror for SecondClass 0: yetAnother = YetAnother 
+0

'लेबल' ओबीजेसी रूपांतरित वर्ग से किसी भी तरह शून्य है (उदाहरण के लिए फर्स्ट क्लास ओबीजेसी में है)। – allenlinli

+0

यह ओबीजेसी समाधान https://stackoverflow.com/questions/13922581/is-there-a-way-to-log-all-the-property-values-of-an-objective-c-instance के बजाय काम करता है – allenlinli

0

हो सकता है कि एक सा पार्टी के लिए देर हो चुकी है, लेकिन इस समाधान प्रतिबिंब का उपयोग और मिरर 100% काम कर रहे है:

class YourClass : NSObject { 
    var title:String 
    var url:String 

    ...something other... 

    func properties() -> [[String: Any]] { 
     let mirror = Mirror(reflecting: self) 

     var retValue = [[String:Any]]() 
     for (_, attr) in mirror.children.enumerated() { 
      if let property_name = attr.label as String! { 
       retValue.append([property_name:attr.value]) 
      } 
     } 
     return retValue 
    } 
} 

और कहीं अपने कोड में ...

var example = MoreRow(json: ["title":"aTitle","url":"anURL"]) 
print(example.listPropertiesWithValues())