在一个属性中附加一个结构,该属性是Swift

时间:2016-12-19 13:47:03

标签: arrays swift struct

大家好我需要在一个数组中追加一个结构,这是一个其他结构的属性,我使用的是Swift 3,但是没有附加任何东西,我不知道为什么,请帮忙吗?

import Foundation

struct Product {
    var objectId: String
    var name: String
    var price: Double
    var qty: Int
    var img: String
    var desc: String
    var note: String
}

struct Order {
    var objectId: String
    var name: String
    var detail: [Product]
    mutating func addToDetail(_ product: Product) {
        detail.append(product)
    }
}

class OrderManager: NSObject {

    static let shared = OrderManager()

    var order: Order?

    var orderCreated: Bool {
        return self.order != nil
    }

    var partnerInOrder: String? {
        return self.order?.objectId
    }

    func createOrderIfNeeded(partnerId: String, name: String) {
        if self.order == nil {
            self.order = Order(objectId: partnerId, name: name, detail: [Product]())
        }

    }

    func addProduct(objectId: String, name: String, price: Double, qty: Int, img: String = "", desc: String = "", note: String = "") {
        guard var order = self.order else {
            return
        }

        let hasProduct = order.detail.contains(where: { $0.objectId == objectId })

        if !hasProduct {
            order.addToDetail(Product(objectId: objectId, name: name, price: price, qty: qty, img: img, desc: desc, note: note))
        }

        print("has product \(hasProduct)")
        print("the whole order is \(self.order)")
    }


    func addOption() {}

    func getProduct() {}

    func getOption() {}

    fileprivate func storeOrder() {}

}

进入struct的addToDetail函数,但是我的数组总是空的

1 个答案:

答案 0 :(得分:1)

在以下guard声明中(addProduct的方法OrderManager

guard var order = self.order else { /* ... */ }

由于Swift中结构的值语义,您创建了self.order副本(假设它不是nil)。随后对此副本上的addToDetail 的调用不会将Product实例附加到order的实例变量self,而只会附加到副本因addProduct超出范围而超出范围。

您可以通过使用简单的guard检查替换上面nil语句中的可选绑定子句来测试此理论(正如@MartinR在下面指出的那样,我们实际上不需要{{1 }}语句(在修复之后:没有绑定),但只能执行早期guard,以防returnself.order

nil

或者,完全删除显式if self.order == nil { return } 检查,并使用可选链接来决定是否向nil实例添加product(合并order项检查和nil在一个可选的链接条款中):

hasProduct

但这显示了代码意图较差的工作。