大家好我需要在一个数组中追加一个结构,这是一个其他结构的属性,我使用的是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函数,但是我的数组总是空的
答案 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
,以防return
为self.order
)
nil
或者,完全删除显式if self.order == nil { return }
检查,并使用可选链接来决定是否向nil
实例添加product
(合并order
项检查和nil
在一个可选的链接条款中):
hasProduct
但这显示了代码意图较差的工作。