我有一個類用戶:反射在迅速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)
,不過,我無法獲得成員名稱及其價值。
我特地到以下資源:
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)")
}
}
注:
這是什麼你正在尋找:http://stackoverflow.com/questions/32691894/reflect-property-value-on-swift-2-0? –
.childrend中的每個元素都將具有.label和.value如果您希望獲取該類型,那麼您可以獲取.value.dynamicType。欲瞭解更多信息,請參閱https://github.com/evermeer/EVReflection/blob/0879793e6d4ed5e554211eea7d654c7a0bfcdb82/EVReflection/pod/EVReflection.swift#L434-434 –
另一個提示:在進入循環之前,您應該調用反射一次。然後在循環中使用該變量。每次你做一個反射(自我)時,都會創建對象的快照。理論上,這個對象甚至可能在同一時間發生變化,導致不同的結果。 –