0

I've tried to return String from my function, but I get error "Use of unresolved identifier nameOfFlower". Here's my function:

func detectFlower(image: CIImage) -> String {
        guard let model = try? VNCoreMLModel(for: FlowerModels().model) else {
            fatalError("Cannot import a model.")
        }

        let request = VNCoreMLRequest(model: model) { (request, error) in

            let classification = request.results?.first as? VNClassificationObservation

            var nameOfFlower = String(classification?.identifier ?? "Unexpected type")



        }

        let handler = VNImageRequestHandler(ciImage: image)

        do {
            try handler.perform([request])
        } catch {
            print(error)
        }

        return nameOfFlower
       }

What is wrong with code?

Jawad Ali
  • 13,556
  • 3
  • 32
  • 49
newbieHere
  • 276
  • 2
  • 15

1 Answers1

2

Its async code .. so use closure as completion block

func detectFlower(image: CIImage,completion: @escaping (_ getString:String?,_ error:Error?)-> Void)  {
     guard let model = try? VNCoreMLModel(for: FlowerModels().model) else {

         fatalError("Cannot import a model.")
     }

     let request = VNCoreMLRequest(model: model) { (request, error) in

         let classification = request.results?.first as? VNClassificationObservation

         var nameOfFlower = String(classification?.identifier ?? "Unexpected type")

         completion(nameOfFlower,nil)

     }

     let handler = VNImageRequestHandler(ciImage: image)

     do {
         try handler.perform([request])
     } catch {
         print(error)
           completion(nil,error)
     }


    }

How to use

     detectFlower(image: yourImage) { (flowerString, error) in
                // you get optional flower string here
            }
Jawad Ali
  • 13,556
  • 3
  • 32
  • 49