e.iluf
e.iluf

Reputation: 1659

how to make a value inside a function global

I would like to make the value of ItemID global so that I can access it out side the function. I have attempted to define it right below class but it doesn't work. How else can I make a value inside a function accessible by other functions?

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!)  {

    // Check if the metadataObjects array is not nil and it contains at least one object.
    if metadataObjects == nil || metadataObjects.count == 0 {
        qrCodeFrameView?.frame = CGRect.zero
        messageLabel.text = "No QR/barcode is detected"
        return
    }
    //Get metadata object
    let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject

    if supportedCodeTypes.contains(metadataObj.type) {
        //if the found metadata is equal to the QR code metadata then update the status label's text and set the the bounds
        let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
        qrCodeFrameView?.frame = barCodeObject!.bounds

        if metadataObj.stringValue != nil {
            messageLabel.text = metadataObj.stringValue
            //Searches firebase for existing barcode
            }
            let itemID = metadataObj.stringValue!
            let itemToSearchFor = itemID

            guard let Description = productDescriptionTextField.text,
            let price = priceTextField.text,
            let location = productLocationTextField.text
            else{
                print("Fill basic product information")
                return
             }
            let ref = FIRDatabase.database().reference(fromURL: "/")
            // creating an  item child node
            let values = ["Item Description": Description, "Image": price, "Location": location, "Price": price]
            let items = ref.child("Items").child(itemID)
            items.updateChildValues(values, withCompletionBlock: { (err, ref) in
                if err != nil {
                    print(err)
                    return
                } })
             FIRDatabase.database().reference().child("Items").child(itemToSearchFor).observeSingleEvent(of: .value, with:{(snap) in
                    print(snap)
                        })
    }}

This is the function where I want to call itemID

 func enterNewProduct() {

    guard let Description = self.productDescriptionTextField.text,
        let price = self.priceTextField.text,
        let location = self.productLocationTextField.text
        else{
            print("Fill basic product information")
            return
    }

    let ref = FIRDatabase.database().reference(fromURL: "/")
    // creating an  item child node
    let values = ["Item Description": Description, "Image": price, "Location": location, "Price": price ]
    let items = ref.child("Items").child(itemID)
    items.updateChildValues(values, withCompletionBlock: { (err, ref) in
        if err != nil {
            print(err)
            return
        } })


    self.dismiss(animated: true, completion: nil)

}

for some reason it is not recognizing the itemID from the previous function

Upvotes: 0

Views: 74

Answers (2)

user7014451
user7014451

Reputation:

It sounds like you've done everything correctly. You forgot to give the code where you "attempted to define it right below class". In case that's the issue, here a template that works:

class ViewController: UIViewController {

    var myID = "ID #1"

    override func viewDidLoad() {
        super.viewDidLoad()
        changeID()
        printID()
    }
    func changeID() {
        printID()
        myID = "ID #2"
    }
    func printID() {
        print(myID)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

The console output is:

ID #1
ID #2

Upvotes: 0

Wez
Wez

Reputation: 10712

Put it above the function somewhere like this.

var itemID:String!
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!)  {

Then in your function you should be able to access it like this.

itemID = metadataObj.stringValue!
let itemToSearchFor = itemID

Make sure to use var so that you can modify it.

Upvotes: 1

Related Questions