gpt4 book ai didi

ios - Struct Gobal 在不应该的时候从另一个 VC 更新

转载 作者:行者123 更新时间:2023-11-28 10:52:35 24 4
gpt4 key购买 nike

我们正在创建一个全局结构,我们在其中存储购物车的产品。这是创建它的代码

class Cart : NSObject {
var allProductsInCart = [Product]()

class var sharedCart: Cart {
struct Static {
static let instance = Cart()
}
return Static.instance
}
}

在一个单独的 View Controller (称为 ProductVC)中,我们正在创建一个 Product 实例。我们将该产品添加到上面列出的数组中,像这样的 allProductsInCart 然后更改值:

let newProduct = Product()
newProduct.name = "Costco"
Cart.sharedCart.allProductsInCart.append(newProduct)
newProduct.name = "test2"
print ("value is: \(Cart.sharedCart.allProductsInCart[0].name)") //It prints "test2" not "Costco"

当在 ProductVC 中修改产品的单独实例时,它也会在结构中发生更改。它绝对是一个单独的产品实例,因为它有一个不同的变量名,如上所示。

它应该仍然打印 Costco,因为 ProductVC 中的 Product 实例在添加到结构后被修改,我们想打印结构中的实例。正确的?还是我哪里有问题?

这是正常行为吗?发生这种情况有原因吗?是否有更好的方法来创建全局变量或创建我们可以在任何 View Controller 中访问的 sharedCart 的更好方法?

最佳答案

发生这种情况是因为 newProduct 是一个引用类型(由类定义),所以当您更改名称时,它只会更改相同引用的名称。此时购物车中只有一件产品,而不是两件。作为引用,在 Swift 中定义单例的最简单方法是

class Cart {
static let shared = Cart()

var products = [Product]()
}

所以,就按照你的例子:

let newProduct1 = Product()
newProduct1.name = "Costco"

Cart.sharedCart.products.append(newProduct1)

let newProduct2 = Product() // a new product
newProduct2.name = "test2"
// I assume you will want to add this product as well
Cart.shared.products.append(newProduct2)

//This will print "Costco"
print ("value is: \(Cart.sharedCart.products[0].name)")

关于ios - Struct Gobal 在不应该的时候从另一个 VC 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45383867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com