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

标签 ios swift swift3

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

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/

相关文章:

objective-c - ScrollView 和信息按钮

php - 将图像从 iOS/Swift 上传到 PHP 服务器

ios - 转换为Swift 3.0语法后,如何将类型“CBManagerState”的值转换为预期类型“CBCentralManagerState”?

ios - Mapbox iOS SDK 折线,swift 3

ios - 从 firebase 获取列表数据,或如何构建数据

ios - IOS9 swift2.0中使用Reduce()函数

ios - 从 3D Touch 快捷菜单加载 View

swift - 具有多个部分以及单选按钮和复选框按钮的 TableView

arrays - 收到错误 : “Cannot subscript a value of type ‘[Double]’ with an index of type ‘(Any) -> Int’ ”

ios - 如何使用用户默认值保存开关的开/关值?