我在尝试创建一个分类应用,但这个UIImageView不断产生Optional nil错误。我不确定如何修复这个问题,非常希望能得到一些支持。谢谢。
我可以使用一个图标或类似的东西,但不知为何我一直无法成功避免这个错误。
import UIKitimport AVKitimport Visionclass FirstViewController: UIViewController, UIImagePickerControllerDelegate,UINavigationControllerDelegate { @IBOutlet weak var myImg: UIImageView! @IBOutlet weak var Label: UILabel! //let imageCG = CGImag override func viewDidLoad() { super.viewDidLoad() detectImageContent() } func detectImageContent() { Label.text = "思考中..." guard let model = try? VNCoreMLModel(for: Resnet50Int8LUT().model) else {return} // 创建一个视觉请求 let request = VNCoreMLRequest(model: model) {[weak self] request, error in guard let results = request.results as? [VNClassificationObservation], let topResult = results.first else { fatalError("意外错误") } DispatchQueue.main.async { [weak self] in self?.Label.text = "\(topResult.identifier) 的置信度为 \(Int(topResult.confidence)*100) %" } } // 下面这一行有Optional错误! guard let ciImage = CIImage(image: self.myImg.image!) else { return} // 运行GoogleNet Places分类器 let handler = VNImageRequestHandler(ciImage: ciImage) DispatchQueue.global().async { do { try handler.perform([request]) } catch { print(error) } } } @IBAction func takePhoto(_ sender: Any) { if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) { let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = UIImagePickerController.SourceType.camera imagePicker.allowsEditing = false self.present(imagePicker,animated: true, completion: nil) } } @IBAction func savedPhoto(_ sender: Any) { if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){ let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = .savedPhotosAlbum imagePicker.allowsEditing = false present(imagePicker, animated: true, completion: nil) } } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { myImg.contentMode = .scaleToFill myImg.image = pickedImage } picker.dismiss(animated: true, completion: nil) detectImageContent() }}
回答:
通过将强制解包(!
)替换为安全解包,就像你在ciImage
的guard let
声明中所做的那样来修复这个问题。因此,要修复你的问题,请将以下内容替换为:
guard let ciImage = CIImage(image: self.myImg.image!) else { return}
替换为:
guard let image = self.myImg.image, let ciImage = CIImage(image: image) else { return }