所有這些都是關於包裝任何對象或類型(= Any)並且能夠檢查類型是否相等。作爲類型和值的包裝器,可以很好地工作。我的問題是,我想拋出一個對象,通過反射找到它的屬性,併爲每個屬性創建一個封裝(包裝)類型的屬性。問題是反射的屬性總是Type Any - 我需要轉換爲它們的真實類型(例如String)。將反射物體的屬性恢復爲其原始類型
例情況搞清楚:
// Functions to check equality of Types
func unsafeGetTypeId(type: Any.Type) -> uintptr_t {
return unsafeBitCast(type, uintptr_t.self)
}
func areOfSameType(v1: Any, v2: Any) -> Bool {
return unsafeGetTypeId(reflect(v1).valueType) == unsafeGetTypeId(reflect(v2).valueType)
}
class ZType {
}
class ZTypeT<T> {
var value: Any?
init() {
}
init(value: T) {
self.value = value
}
}
class SampleClass {
var sampleProperty : String
init(aString: String) {
self.sampleProperty = aString
}
}
var sample = SampleClass(aString: "Hans")
var t1 = ZTypeT<String>()
var t2 = ZTypeT(value: sample.sampleProperty)
areOfSameType(t1, t2) // true
var mirror = reflect(sample)
for var index=0; index<mirror.count; ++index {
let (propertyName, childMirror) = mirror[index]
var tTestAgainst = ZTypeT<String>()
// This is obviously of type Any so it won`t be ZTypeT<String>() but ZTypeT<Any>()
var tMirrorProp = ZTypeT(value: childMirror.value)
areOfSameType(tMirrorProp, tTestAgainst) // false
// So how could i cast the value back to it`s type? This would work but it should be generic : i don`t know the type beforehand
var tMirrorPropCasted = ZTypeT(value: childMirror.value as String)
areOfSameType(tMirrorPropCasted, tTestAgainst) // false
}
正如你可以看到所有的作品如預期,直到tMirrorProp,因爲這會不會是String類型。如果我投了它,我的支票將再次成爲真實 - 但我不知道這種類型是無法投射的。有沒有人知道解決方案來解決這個問題。使用Swift-Classes的解決方案是首選,但與NSObject(s)協同工作的解決方案仍然存在問題。
也許這個代碼可以幫助。它能夠將對象解析爲字典。 https://github.com/evermeer/EVCloudKitDao/blob/master/AppMessage/AppMessage/CloudKit/EVReflection.swift – 2015-02-17 22:05:29