Ich habe eine Reihe von AnyObject
, und ich möchte es gegossen (oder einem seiner Objekte) auf einen generischen Typ T
die gegebenen darf kein Array sein.cast [ANYOBJECT] zu gattungsgemäßen Art, der nicht eine Sammlung Typ sein können oder auch
Mein erster Versuch:
class MyClass<T> {
func someMethod() -> T? {
let anyObjectArray: [AnyObject] = // ... array obtained from Objective-C framework
if let objectsAsCollection = anyObjectArray as? T { // Cast always fails
return objectsAsCollection
} else if let firstObject = anyObjectArray.first as? T {
return firstObject
} else {
return nil
}
}
}
Der erste if let
Guss schlägt fehl, wenn T
ist ein Array
(z T.self == Array<SomeObject>.self
).
Ich würde so etwas wie dies versuchen, aber es geht irgendwie eine andere generische Parameter einzuführen, so nicht gültig ist, wie geschrieben:
extension MyClass where T == Array<U> {
fun someMethod() -> T? {
let anyObjectArray: [AnyObject] = // ... array obtained from Objective-C framework
if let objectsAsCollection = anyObjectArray.flatMap({ $0 as? U }) {
return objectsAsCollection
} else if let firstObject = anyObjectArray.first as? T {
return firstObject
} else {
return nil
}
}
}
Der Grund für den Wunsch, dies zu tun, ist, dass ich verwende ein Objective-C-Framework (RestKit), um Ergebnisse von einer REST-API zu erhalten. Ich baue eine Schicht auf der Oberseite in Swift, die diese Ergebnisse zurück, als eine bestimmte Art leitet die Anfrage nach, die gemacht wurde, so habe ich eine Result
Typ, der etwa wie folgt aussieht:
enum Result<T>: {
case Success(T)
case Failure(Error)
}
Manchmal T
ist ein Single Objekt, manchmal ist es ein Array von Objekten, aber das Objective-C-Framework gibt Ergebnisse immer als Array zurück.
diskutiert wird. Dies wird schwierig ohne eine Einschränkung der Anzahl __verschiedener_ Objekttypen, die das Array "AnyObject" enthält. Zum Beispiel sagt Ihr '[AnyObject]' '' NSString' sowie eine 'NSNumber'-Instanzen: Wie werden diese in ein Array eines nativen Swift-Typs gegossen? Denken Sie daran, dass im Allgemeinen die Verwendung eines generischen, sagen wir "T", unterschiedlichen Typen erlaubt, die Methode aufzurufen, aber für jeden solchen Aufruf ist "T" auf einen einzigen Typ festgelegt. Wissen Sie sicher, dass das Array "AnyObject" immer nur einzelne Objekte desselben Typs enthält? – dfri
@dfri Das Array 'AnyObject', das vom Objective-C-Framework zurückgegeben wird, kann theoretisch einen beliebigen Typ enthalten. In Wirklichkeit weiß ich jedoch, dass die REST-API ein Array eines bestimmten Typs zurückgibt, sodass für jeden Aufruf "T" entweder "SomeType" oder "Array" ist (wobei "SomeType" abhängig davon variiert, welcher Objekttyp zurückgegeben wird) vom Server). –
Stuart
Ich denke, dass ich kürzlich mit jemand anderem genau dasselbe Problem besprochen habe, und wir haben das gelöst, indem wir '[AnyObject]' durch 'NSArray' ersetzt haben. – Sulthan