我们正在创建一个全局结构,我们在其中存储购物车的产品。这是创建它的代码
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/