Verwandte Frage mit: Generic completion handler in SwiftEXC_BAD_ACCESS Generics in Swift
In einer Swift App Ich schreibe, ich bin das Herunterladen JSON und ich möchte es in Modellobjekte konvertieren. Gerade jetzt, ich mache das so:
func convertJSONData<T: Entity>(jsonData: NSData?, jsonKey: JSONKey, _: T.Type) -> [T]? {
var entities = [T]()
if let data = jsonData {
// Left out error checking for brevity
var json = JSON(data: data, options: nil, error: nil)
var entitiesJSON = json[jsonKey.rawValue]
for (index: String, subJson: JSON) in entitiesJSON {
// Error: EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
let entity = T(json: subJson)
entities.append(entity)
}
}
return entities
}
Jedes Objekt konform Entity
Geräte init(json: JSON)
. JSON
ist ein Typ, der in der -Bibliothek definiert ist. Das ist auch der Grund, warum die Aufzählung ein bisschen komisch aussieht.
Ich nenne convertJSONData()
in dieser Methode:
public func performJSONRequest<T where T: Entity>(jsonRequest: JSONRequest<T>) {
var urlString = ...
Alamofire.request(.GET, urlString, parameters: nil, encoding: .JSON).response { (request, response, data, error) -> Void in
var books = self.convertJSONData(data as? NSData, jsonKey: jsonRequest.jsonKey, T.self)
jsonRequest.completionHandler(books, error)
}
}
ich einen Laufzeit EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
Fehler bekommen Aufruf T(json: subJSON)
. Es gibt keine Compiler-Warnungen oder Fehler. Obwohl ich die Fehlerüberprüfung im obigen Code ausgelassen habe, gibt es eine Fehlerüberprüfung im tatsächlichen Code und error
ist Null.
Ich bin mir nicht sicher, ob dies ein Compiler Bug oder meine Schuld ist und jede Hilfe, die das herauszufinden, wird sehr geschätzt.
Ist die Klasse Entity und die 'init' öffentlichen oder lokalen das Projekt? –
Es ist eigentlich ein Protokoll, markiert als "öffentlich". Protokollmethoden können nicht als 'public' markiert werden, aber da 'Entity' selbst ist, sehe ich nicht, wie das das Problem verursachen könnte. – wander
Welchen Typ meldet der Debugger für 'entitiesJSON'? –