questione connessa: Generic completion handler in SwiftEXC_BAD_ACCESS utilizzando Generics a Swift
In un'applicazione Swift sto scrivendo, sto scaricando JSON e voglio convertirlo in oggetti del modello. In questo momento, sto facendo che in questo modo:
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
}
ogni oggetto conforme alla Entity
attrezzi init(json: JSON)
. JSON
è un tipo definito nella libreria SwiftyJSON. Questa è anche la ragione per cui l'enumerazione sembra un po 'strana.
io chiamo convertJSONData()
in questo metodo:
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)
}
}
ottengo un runtime EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
errore di chiamare T(json: subJSON)
. Non ci sono avvisi o errori del compilatore. Anche se ho omesso il controllo degli errori nel codice sopra, c'è il controllo degli errori nel codice effettivo e error
è nullo.
Non sono sicuro che si tratti di un bug del compilatore o di una mia colpa e qualsiasi aiuto che lo comprenda è molto apprezzato.
è la classe Entity e la 'init' pubblico o locale il progetto? –
In realtà è un protocollo, indicato come 'pubblico'. I metodi di protocollo non possono essere contrassegnati come 'public', ma poiché' Entity' stesso è, non vedo come ciò potrebbe causare il problema – wander
che tipo riporta il debugger per 'entitiesJSON'? –