在结构上使用Swift协议委派来更改值吗?

问题描述 投票:0回答:1

我有一个项目,希望有factoriesordersInts的数组)可以更改。

我希望所有代码对另一个类中的订单进行更改,添加,删除,验证等操作(即:几乎像代理模式一样,并在准备好时用新订单更新工厂。

我遵循委托模式将新订单踢回工厂进行更新,但是工厂订单从未更新。

注意:我知道这是因为工厂是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数组?

如果没有,我将其更改为一个类;但我对此表示感谢。

谢谢

swift struct delegates swift-protocols
1个回答
0
投票

正如您所说的,因为Factory是一个结构,所以当设置OrderBook delegate时它已经被复制到那里,因此delegate实际上是原始工厂实例的副本。

A class是对此的合适解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.