我有一个项目,希望有factories
和orders
(Ints
的数组)可以更改。
我希望所有代码对另一个类中的订单进行更改,添加,删除,验证等操作(即:几乎像代理模式一样,并在准备好时用新订单更新工厂。
我遵循委托模式将新订单踢回工厂进行更新,但是工厂订单从未更新。
注意:我知道这是因为工厂是struct
并且它是值类型
我想知道是否有可能使用委托模式来更新结构;还是必须将其更改为引用类型(类)才能解决该问题。
在下面的代码中,我删除了所有的验证,推送,弹出和其他功能,并通过强制更改订单数组,然后使用委托将已更改的订单撤回来简化此查询。
// Swift playground code
protocol OrderUpdatedDelegate {
mutating func ordersDidUpdate(_ orders: [Int])
}
// This class will handle all the validation to do with
// orders array, but for now; lets just force
// change the orders to test the delegate pattern
class OrderBook {
var delegate: OrderUpdatedDelegate?
var orders: [Int] = [Int]()
init(orders: [Int]) {
self.orders = orders
}
func changeOrders() {
self.orders = [7,8,1]
print ("updated orders to -> \(orders)")
delegate?.ordersDidUpdate(orders)
}
}
struct Factory {
var orders: [Int] = [Int]()
init(orders: [Int]) {
self.orders = orders
}
}
extension Factory: OrderUpdatedDelegate {
mutating func ordersDidUpdate(_ orders: [Int]) {
print ("recieved: \(orders)")
self.orders = orders
}
}
var shop = Factory(orders: [1,2,3])
let book = OrderBook.init(orders: shop.orders)
book.changeOrders()
print ("\nBook.orders = \(book.orders)")
print ("Shop.orders = \(shop.orders)")
输出:
Book.orders = [7,8,1]
Shop.orders = [1、2、3]
再次,我知道原因是因为我已经宣布factory为struct
;但是我想知道是否可以使用委托模式来改变结构中的orders数组?
如果没有,我将其更改为一个类;但我对此表示感谢。
谢谢
正如您所说的,因为Factory
是一个结构,所以当设置OrderBook
delegate
时它已经被复制到那里,因此delegate
实际上是原始工厂实例的副本。
A class
是对此的合适解决方案。