2015-10-04 66 views
3

我有一個類用戶:反射在迅速2

import UIKit 
import ObjectMapper 


class User: NSObject, CustomStringConvertible, Mappable { 

    var FirstName: NSString! ; 
    var LastName: NSString! ; 


    required init?(_ map: Map){ 

    } 


    func mapping(map: Map) { 

     FirstName <- map["FirstName"] 
     LastName <- map["LastName"] 

    } 


    override var description:String { 
     var s:String="" 

    //USE REFLECTION TO GET NAME AND VALUE OF DATA MEMBERS  
     for var index=1; index<reflect(self).count; ++index { 
      s += (reflect(self)[index].0 + ": "+reflect(self)[index].1.summary+"\t") 
     } 

     return s 
    } 
} 

在迅速1.2,我用反映()方法來獲得所有與它們的名稱和值的數據成員的陣列。

現在,我已經更新到SWIFT 2,我收到以下錯誤後:

'reflect' is unavailable: call the 'Mirror(reflecting:)' initializer

對於一些試驗,我能夠通過它來獲取數據成員的計數:Int(Mirror(reflecting: self).children.count),不過,我無法獲得成員名稱及其價值。

我特地到以下資源:

  1. https://netguru.co/blog/reflection-swift
  2. http://nshipster.com/mirrortype/

UPDATE 我發現這裏的答案:https://stackoverflow.com/a/32846514/4959077。但是這並不能說明如何找出反映價值的類型。如果這個值是int並且我們把它解析成String,那麼它會給出錯誤。

let mirror = Mirror(reflecting: SomeObject) 

var dictionary = [String: Any]() 
for child in mirror.children { 
    guard let key = child.label else { continue } 
    let value: Any = child.value 

    dictionary[key] = value 

    switch value { 
    case is Int: print("integer = \(anyValue)") 
    case is String: print("string = \(anyValue)") 
    default: print("other type = \(anyValue)") 
    } 

    switch value { 
    case let i as Int: print("• integer = \(i)") 
    case let s as String: print("• string = \(s)") 
    default: print("• other type = \(anyValue)") 
    } 

    if let i = value as? Int { 
     print("•• integer = \(i)") 
    } 
} 

注:

+0

這是什麼你正在尋找:http://stackoverflow.com/questions/32691894/reflect-property-value-on-swift-2-0? –

+1

.childrend中的每個元素都將具有.label和.value如果您希望獲取該類型,那麼您可以獲取.value.dynamicType。欲瞭解更多信息,請參閱https://github.com/evermeer/EVReflection/blob/0879793e6d4ed5e554211eea7d654c7a0bfcdb82/EVReflection/pod/EVReflection.swift#L434-434 –

+0

另一個提示:在進入循環之前,您應該調用反射一次。然後在循環中使用該變量。每次你做一個反射(自我)時,都會創建對象的快照。理論上,這個對象甚至可能在同一時間發生變化,導致不同的結果。 –

回答

3

如下您可以訪問的反射屬性「標籤」名稱,值和類型每個問題隨訪,三種方法來確定反射值的類型所示。

1

我有一個解決方案,可以找到從NSObject繼承的任何類的屬性的名稱和類型。

我寫了一篇關於StackOverflow here冗長的解釋,我的項目可here on Github

總之,你可以做這樣的事情(但真正檢查出的代碼Github上):

public class func getTypesOfProperties(inClass clazz: NSObject.Type) -> Dictionary<String, Any>? { 
    var count = UInt32() 
    guard let properties = class_copyPropertyList(clazz, &count) else { return nil } 
    var types: Dictionary<String, Any> = [:] 
    for i in 0..<Int(count) { 
     guard let property: objc_property_t = properties[i], let name = getNameOf(property: property) else { continue } 
     let type = getTypeOf(property: property) 
     types[name] = type 
    } 
    free(properties) 
    return types 
}