2015-04-18 34 views
5

Ho giocato con Swift. Ho avuto più errori con i tipi, specialmente lavorando con Swift e le mie vecchie classi Objective-C. Il problema con questo metodo è: mi aspetto un array fatto di NSDictionarys in Objective-C.Come assegnare un dizionario a AnyObject in swift

var curArr:[Dictionary<String, AnyObject>] = self.getItemsForCurrentStack() 
var arrToReturn:[(Dictionary<String, AnyObject?>)] = [] 
for obj in curArr{ 
    arrToReturn.append(["image": UIImage(named: obj["imageName"] as! String), "color": UIColor(red:obj["colorDic"]!["red"] as! CGFloat, green:obj["colorDic"]!["green"] as! CGFloat, blue:obj["colorDic"]!["blue"] as! CGFloat, alpha:1.0), "percentage": obj["percantage"]]) 
} 
return arrToReturn 

Restituisce Dizionari (che sono NSDiction) in Swift. Ma l'ultima riga mi genera un errore:

Dictionary' is not identical to 'AnyObject'

Ho provato con as! [AnyObject]

Ma che genera un altro errore:

'AnyObject' is not a subtype of 'Dictionary'

non ottengo il secondo errore, dal momento che questo non deve essere un sottotipo, ma viceversa. Qualche idea su come risolvere questo? Non ho trovato risposta per diverse ore di googleing e ricerca.

+0

var arrToReturn: [String: ANYOBJECT] = [] o var arrToReturn: [ANYOBJECT] = [] se si vuole restituire un array di AnyObjects –

risposta

7

Dictionary è una struttura a Swift, mentre AnyObject è

/// The protocol to which all classes implicitly conform.

seconda cosa si sta cercando di fare, si consiglia di utilizzare Any nel codice, o lanciare il dizionario a NSDictionary utilizzando as NSDictionary.


Modifica dopo la vostra precisazione:

Se si divide il append chiamata dal dizionario stesso, viene visualizzato un messaggio di errore più:

Quindi, la questione è che il tuo dizionario contiene alcuni valori Optional, ma Facoltativo è una struct e non convertibile in Obj-C. È possibile correggere lanciando su UIImage! e AnyObject! (ImplicitlyUnwrappedOptional) o utilizzando as!.

+0

Se lo faccio con 'var arrToReturn: [NSDictionary] = [] per obj in curArr { arrToReturn.append ([" immagine ": UIImage (denominato: obj [" imageName "] as! String)," color " : UIColor (rosso: obj ["colorDic"]! ["Red"] come! CGFloat, green: obj ["colorDic"]! ["Green"] as! CGFloat , blue: obj ["colorDic"]! ["blue"] as! CGFloat, alpha: 1.0), "percentage": obj ["percantage"]] as! NSDictionary) }, Ho ricevuto l'errore: 'Impossibile richiamare 'append' con un elenco di argomenti di tipo '(NSDictionary)'' – user2456014

+0

L'utilizzo di Any non è possibile perché questo metodo è generato da Xcode e non può essere modificato perché si aspetta un NSArray nel codice Objective-C. – user2456014

+1

Quale versione di Xcode stai usando? Per me funziona. – jtbandes

1

Il tuo codice funziona bene nel parco giochi, senza errori di compilazione o di runtime. Ecco quello che ho aggiunto per popolare curArr:

var curArr:[Dictionary<String, AnyObject>] = [ 
    [ 
     "imageName" : "photo.jpg", 
     "colorDic" : ["red" : 1.0, "green" : 0.0, "blue" : 0.0], 
     "percentage" : 0.5 
    ] 
] 

Con tutto questo costretto scartare Credo che bisogna solo fare in modo che ciò che self.getItemsForCurrentStack() rendimenti è proprio ciò che ci si aspetta.

Risultato nel parco giochi:

[ 
"percentage": {Some 5.0e+-1}, 
"image": nil, 
"color": {Some r 1,0 g 0,0 b 0,0 a 1,0} 
] 

Il mio consiglio sarebbe quello di refactoring in oggetti - che renderebbe il codice in modo molto più leggibile!

+0

Il problema non è quel codice, ma l'istruzione return, restituendo arrToReturn dove è prevista una matrice di NSDictionaries o altri oggetti. – user2456014

0

In Swift 3

code: 

var curArr:[Dictionary<String, Any>] = [ 
[ 
     "imageName" : "photo.jpg", 
     "colorDic" :[ 
      "red" : 1.0, 
      "green" : 0.0, 
      "blue" : 0.0 
     ], 
     "percentage" : 0.5 
    ] 
] 

enter image description here

Problemi correlati