【问题标题】:Subtract Int with firestore value in Swift在 Swift 中用 Firestore 值减去 Int
【发布时间】:2021-07-02 03:59:37
【问题描述】:

我正在尝试在我的应用中制作优惠券系统。 当用户在文本字段中键入时,它应该寻找与文本匹配的优惠券。 我已经设法检索到正确的文档,但我不知道如何从购物车的小计中减去文档字段值“percentOff”。 这是一些代码:

我获取文档的代码:

func textFieldDidEndEditing(_ textField: UITextField) {
        if textField == couponTxt {
            let collectionRef = db.collection("coupons")
            collectionRef.whereField("name", isEqualTo: couponTxt.text!).getDocuments { (snapshot, err) in
                if let err = err {
                    print("Error getting document: \(err)")
                } else {
                    for document in (snapshot?.documents)! {
                        if document == document {
                            let data = document.data()
                            let couponData = Coupon.init(data: data)
                          print(document.documentID)
                            }
                            
                        }
                    }
                }
            }
        }

这是我获取优惠券数据的模型:


 init(data: [String: Any]) {

        self.name = data["name"] as? String ?? ""
        self.id = data["id"] as? String ?? ""
        self.percentOff = data["percentOff"] as? Double ?? 0.0
        self.kronerOff = data["kronerOff"] as? Double ?? 0.0
        self.usageLeft = data["usageLeft"] as? Int ?? 0

    }

来自我的 PaymentCart 类的代码 - 小计:

 var subtotal: Int {
        var amount = 0
        for item in cartItem {
            let priceOere = Int(item.price * 100)
            amount += priceOere
        }
        return amount
    }

所以我的问题是 - 现在我可以获得正确的文档,如何从 percentOff 中获取值并减去我当前的小计。 谢谢!

【问题讨论】:

    标签: ios swift xcode google-cloud-firestore uitextfield


    【解决方案1】:

    当您获取优惠券文档并创建Coupon 对象时,如果您想稍后访问它,则必须将其放在某个位置。现在,除了初始化它之外,您不会对 couponData 做任何事情。 subtotal 是一个计算属性,需要访问couponData,所以couponData 必须在这个计算属性的范围内,所以就让它发生吧。例如,如果subtotal 在视图控制器中,那么只需将couponData 设为同一视图控制器中的实例属性。然后subtotal 可能看起来像这样:

    var coupon: Coupon?
    
    var subtotal: Int {
        var amount = 0
        for item in cartItem {
            let priceOere = Int(item.price * 100)
            amount += priceOere
        }
    
        if let coupon = coupon {
            let discountRate = 1 - coupon.percentOff // assuming a 10% off coupon is 0.1 and not 10.0
            return amount * discountRate
        } else {
            return amount
        }
    }
    

    但是在你到达这里之前,你必须给coupon赋值:

    func textFieldDidEndEditing(_ textField: UITextField) {
        if textField == couponTxt {
            let collectionRef = db.collection("coupons")
            collectionRef.whereField("name", isEqualTo: couponTxt.text!).getDocuments { (snapshot, err) in
                if let err = err {
                    print("Error getting document: \(err)")
                } else {
                    for document in (snapshot?.documents)! {
                        if document == document {
                            let data = document.data()
                            let couponData = Coupon(data: data)
                            self.coupon = couponData // assign it to the instance property
                            print(document.documentID)
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答!我的小计与文本字段不在同一个视图控制器中。它位于名为 _PaymenCart 的最终类中。那我该怎么做呢?
    • 这完全取决于您。此决定是您必须对数据的整体组织做出的更大决定的一部分。将购物车数据与优惠券数据保存在同一个对象中并不是世界上最糟糕的主意,对吧?也许这个数据管理器对象所做的只是存储购物数据。也许它是一个单例,也可能不是——所有的决定都是你必须做出的。但只是为了让事情顺利进行,就目前而言,将其设为全局变量并确认一切正常,然后决定将其放置在何处以及如何构建数据。
    • 好的。它没有用。我将小计设为公共变量。但输入优惠券后的小计结果完全关闭..
    • public 变量和全局变量之间是有区别的。 public 是 Swift 中的控制访问级别,全局只是将变量放在任何对象之外,以便每个对象都可以访问它。将coupon 设为全局变量(同样,仅用于测试)并确认折扣已准确应用。
    • 我现在已经做到了。它也不起作用。什么都没有发生:/
    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多