swift - 如何使用全局变量,以便可以使用Swift 4在不同的函数中识别它们?

标签 swift

我正在使用导航中心通过视图控制器发送数据。但是我想在按钮内使用此数据,但无法识别该变量。

未被识别的是currentid。

class ViewController10: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate, UITextViewDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(forName: ID_TRANSFER, object: nil, queue: nil){ notification in
            if let object = notification.object as? [String: Any] {
                if let currentid = object["UserID"] as? Int {
                    print(currentid, "crap it works")

                }
            }
        }

        enterPrice1.delegate = self
        enterBrand.delegate = self
        enterProduct1.delegate = self
        enterComment.delegate = self


        var fileUrl = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("RateappDatabase4.sqlite")


        if sqlite3_open(fileUrl.path, &db) != SQLITE_OK{
            print("Error opening database")

            print(fileUrl = try!
                FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("RateappDatabase4.sqlite"))
        }


        if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Rate (RateID INTEGER PRIMARY KEY AUTOINCREMENT, rating INTEGER, UserID INTEGER, ProductId INTEGER, PostID INTEGER)", nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error creating table: \(errmsg)")

        }

        if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Product (ProductID INTEGER PRIMARY KEY AUTOINCREMENT, product TEXT, UserID INTEGER, brand TEXT, price INTEGER, PostID INTEGER)", nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error creating table: \(errmsg)")

        }

        if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Comment (CommentID INTEGER PRIMARY KEY AUTOINCREMENT, comment TEXT, UserID INTEGER, orderCom INTEGER, PostID INTEGER)", nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error creating table: \(errmsg)")

        }

        if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Post (PostID INTEGER PRIMARY KEY AUTOINCREMENT, ProductID INTEGER, UserID INTEGER, RateID INTEGER, CommentID INTEGER, Post TEXT)", nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error creating table: \(errmsg)")

        }        // Do any additional setup after loading the view.

        imagePicker.delegate = self
        imagePicker.sourceType = .camera
        imagePicker.allowsEditing = false
    }

    @IBOutlet weak var enterPrice1: UITextField!
    @IBOutlet weak var enterComment: UITextField!
    @IBOutlet weak var enterBrand: UITextField!
    @IBOutlet weak var enterProduct1: UITextField!

    @IBAction func lipstick1(_ sender: Any) {

        var stmt: OpaquePointer?

        let queryString3 = "INSERT INTO Rate (rating, UserID) VALUES (?, ?)"

        let lipstickValue1 = 1

        if sqlite3_prepare(db, queryString3, -1, &stmt, nil) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error preparing insert: \(errmsg)")
            return

        }
        if sqlite3_bind_int(stmt, 1, Int32(lipstickValue1)) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure inserting lipstick1: \(errmsg)")
            return
        }
        if sqlite3_bind_int(stmt, 2, Int32(currentid)) != SQLITE_OK{
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure inserting lipstick1: \(errmsg)")
            return
       }
        if sqlite3_step(stmt) != SQLITE_DONE {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("failure binding lipstick1: \(errmsg)")
            return
        }
        print("rating of 1")
    }
}

最佳答案

在类的开头声明变量,并为其提供可选值,然后在检索时分配该值。

Class MyClass {
      var currentid: Int32?
}

NotificationCenter.default.addObserver(forName: ID_TRANSFER, object: nil, queue: nil){ notification in
        if let object = notification.object as? [String: Any] {
            if let currentidVal = object["UserID"] as? Int {
                currentid = currentidVal

            }
        }
    }

关于swift - 如何使用全局变量,以便可以使用Swift 4在不同的函数中识别它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54669183/

相关文章:

ios - 如何使用分钟数据过滤特定的一天时间作为 Swift 3 中多个索引中的单个索引存储到数组中

facebook - Xcode7 swift函数需要多少时间?比赛条件?

ios - queryStarting(atValue 未按预期工作?

swift - 使用 MFMailComposeViewController 发送电子邮件后关闭模态视图 Controller

arrays - 访问数组中的元素数量并应用重力行为

ios - 以编程方式调用表情符号键盘?

ios - 在同一 viewController 中嵌入的不同 Collection View 的两个单元格之间发送数据

swift - NSTimer 倒计时产生两次 0

ios - 如何更改 UItableviewcell accessoryType 的背景颜色?

ios - 如何在 Swift 中按下按钮时显示 slider ?