Ich versuche, Typinformationen in Swift 2.0 zu analysieren - und es in einer statischen Struktur zu speichern - aber stecke fest. Der erfolgversprechendste Ansatz besteht darin, einen Spiegel für eine Instanz zu erstellen - was einmal bei Bedarf gemacht werden würde, wobei eine Standardinitialisierung vorausgesetzt wird - und den subjectType der Spiegelelemente zu betrachten.Swift 2.0 Reflection für die Typanalyse
Meine Fragen sind:
- Wie optionale Typen (z
Optional<String>
) auszupacken. Ich möchte denString
Teil als einen Typ haben. - Wie generische Array-Typen, z.B.
Array<Foo>
.
Parsen der String ist albern und es ist wahrscheinlich nicht möglich ..
Andere Fragen zu Arrays bezogen werden: Wenn ein den Elementtyp haben, wie erstelle ich eine neue Instanz?
Um es klarer zu machen. Ich benötige die Typinformationen für höherwertige Algorithmen wie Mapper - Objektzuordnungen, Json-Mapper, Widget-Mapper usw. -, die Informationen über den Typ der involvierten Objekte, die versuchen, typsicher zu sein, oder bei Bedarf durch Einfügen geeigneter Konvertierungen benötigen.
Denken Sie an eine Eigenschaft Int
, die einer Int?
-Eigenschaft zugeordnet werden muss, die keine Ausnahme auslösen sollte.
Der Code bisher füllt eine BeanDescriptor
Klasse, die ein Array von PropertyDescriptor
‚s enthält, die alle erforderlichen Informationen speichern soll
Etwas wie:
class PropertyDescriptor {
// instance data
var bean: BeanDescriptor;
var name: String;
var type: Any.Type;
var optional = false
// more data for arrays, e.g. elementType...
...
}
-Code bisher eine Klasse zu analysieren ist:
// create a default instance
let instance = create(); // we need a NSObject though! darn...
let mirror = Mirror(reflecting: instance)
if let displayStyle = mirror.displayStyle {
if displayStyle == .Class {
for case let (label?, value) in mirror.children {
let property = analyzeProperty(label, value: value)
properties[property.name] = property;
} // for
}
}
und die aufgerufene Funktion
func analyzeProperty(name : String, value: Any) -> PropertyDescriptor {
let mirror : Mirror = Mirror(reflecting: value)
var type = mirror.subjectType
var optional = false
// no way..this sucks!
if (type == String?.self) {
type = String.self // uhhhh
optional = true
}
else if ... // lots other literal types, ...
return PropertyDescriptor(bean: self, name: name, type: type, optional: optional)
}
Aber dies deckt andere optionale Klassen Money?
sowie andere Informationen in Bezug auf Arrays, z. Array<Money>
oder Array<Money?>
wobei i einen Array-Typen erkennen würde und den Elementtyp
Ich bin es schwer hat zu verstehen, was du willst. Denkst du, du könntest Code schreiben? Etwas was zeigt, was du hast, was du willst, und möglicherweise Pseudo-Code, der zeigt, was du denkst? – solidcell
bearbeitet die Frage :-) –