2015-07-27 11 views
7

Dopo aver aggiornato il mio xcode per eseguire swift 2, mi danno questi due errori che ho difficoltà a risolvere.l'inizializzatore swift 2 per il bind condizionale deve avere il tipo opzionale, non 'UIImage'

di errore 1 Non può indicizzare un valore di tipo '[String: ANYOBJECT]?' con un indice di tipo 'String'

Codice

let image : UIImage = editingInfo[UIImagePickerControllerOriginalImage] as! UIImage 

errore 2 Initializer per condizionale deve avere tipo opzionale vincolante, non e 'UIImage'

Codice

if let constImage = image (Error2 display here) 
     { 
      let targetWidth = UIScreen.mainScreen().scale * UIScreen.mainScreen().bounds.size.width 
      let resizedImage = constImage.resize(targetWidth) 

      picker.dismissViewControllerAnimated(true, completion: { 
       () -> Void in 

       NetworkManager.sharedInstance.postImage(resizedImage, completionHandler: { 
        (error) ->() in 

        if let constError = error 
        { 
         self.showAlert(constError.localizedDescription) 
        } 
       }) 

      }) 
     } 
+0

Swift 2 ha risolto una tonnellata di getto scadente che esisteva tra il codice Objective-C in Swift. Quindi la tua variabile "constImage" è quasi come se fosse già un UIImage e/o non un tipo opzionale, quindi non devi necessariamente scartarlo condizionatamente. – DBoyer

risposta

5

Seguendo codice ...

let image : UIImage = editingInfo[UIImagePickerControllerOriginalImage] as! UIImage 

... sta andando in crash se non c'è UIImagePickerControllerOriginalImage tasto o se non è un'immagine.

Da dove hai ricevuto editingInfo? Perché imagePickerController:didFinishPickingImage:editingInfo: non è disponibile in Swift. Dovresti usare optional func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]).

tuo secondo errore nella riga seguente ...

if let constImage = image 

... è causata da let image: UIImage = ... linea. Il tuo image è di tipo UIImage, non UIImage?. Pertanto non è opzionale e non è possibile utilizzarlo in if let constImage = image. Deve essere UIImage? se si desidera utilizzarlo in questo modo. BTW non è necessario utilizzare let image: UIImage = ..., let image = ..., perché il compilatore può inferire il tipo di variabile dalla propria istruzione.

Riscrivilo in qualcosa di simile.

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

    guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { 
    // throw an error, return from your function, whatever 
    return 
    } 
    // from now you can use `image` safely 
    // it does exist and it's not optional 

    let targetWidth = UIScreen.mainScreen().scale * UIScreen.mainScreen().bounds.size.width 
    let resizedImage = image.resize(targetWidth) 

    picker.dismissViewControllerAnimated(true, completion: { 
    () -> Void in 

    NetworkManager.sharedInstance.postImage(resizedImage, completionHandler: { 
     (error) ->() in 

     if let constError = error 
     { 
     self.showAlert(constError.localizedDescription) 
     } 
    }) 

    }) 

} 

seguito parte ...

guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { 
    // throw an error, return from your function, whatever 
    return 
    } 

... fa questo ...

  • c'è un valore in info dizionario per UIImagePickerControllerOriginalImage chiave? se no, l'istruzione else {} viene eseguita,
  • il valore è lì, posso lanciarlo su UIImage? se no, viene eseguita else {} dichiarazione,
  • ora abbiamo valore da info colato con successo per UIImage e conservato in image, else {} istruzione non viene eseguita e la nostra funzione continua.

Modo sicuro come ottenere un valore dal dizionario di qualche tipo quando il tipo di valore del dizionario è AnyObject ad esempio.

Problemi correlati