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.
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