我有这些我想变异的结构:
public struct CheckoutViewModel {
var sections: [Section]
var total: String
public struct Section {
var title: String
var description: String
var kind: Kind
var expandState: ExpandState
enum Kind {
case products([ProductOrderViewModel])
case shippingMode(SelectableArray<ShippingMode>)
case shippingTarget(SelectableArray<ShippingKind>)
case billingAddress(SelectableArray<Address>)
case payment(SelectableArray<PaymentProvider>)
case promoCode(String?)
case legalAdvice(userAccepted: Bool)
}
}
}
struct SelectableArray<T> {
var selectedIndex: Int?
let options: [T]
init(options: [T]) {
self.options = options
self.selectedIndex = nil
}
mutating func select(atIndex: Int) throws -> T {
guard atIndex < options.count else {
throw SelectableArrayError.outOfBoundsIndex
}
selectedIndex = atIndex
return options[atIndex]
}
var selectedElement: T? {
guard let selectedIndex = selectedIndex else { return nil }
return options[selectedIndex]
}
}
我想在SelectableArray中使用这个变异的func select()方法,我从变异函数链中调用它(因为Sections嵌套在结构中)
extension CheckoutViewModel {
mutating func select(atIndexPath indexPath: IndexPath) {
sections[indexPath.section].select(atIndex: indexPath.row)
}
}
extension CheckoutViewModel.Section {
mutating func select(atIndex idx: Int) {
switch kind {
case .shippingMode(var modes):
do { _ = try modes.select(atIndex: idx) } catch { return }
default:
return nil
}
dump(self) // Here self hasn't changed
}
}
问题是CheckoutViewModel结构永远不会发生突变。我猜开关不是一个变异函数,所以开关中的var模式
是不可变的,然后下面的函数是否发生任何变异都没关系。我设法做的解决方法是这样的:
mutating func select(atIndex idx: Int) {
switch kind {
case .shippingMode(var modes):
do {
_ = try modes.select(atIndex: idx)
self.kind = .shippingMode(modes)
} catch { return }
default:
return
}
}
你对这个问题有什么其他的解决方案吗?我可以使用任何类型的可变开关
函数吗?
根据Swift编程语言:
switch
case可以将其匹配的一个或多个值绑定到临时常量或变量,以在case主体中使用。这种行为称为值绑定,因为值绑定到case主体中的临时常量或变量。
对此类临时变量(例如模式
变量)的更改不会影响正在打开的枚举的内容(例如类
)。
对于您的第一种工作方法,您确实需要一种不同类型的switch语句,该语句创建对枚举关联值的引用,允许您在适当的位置修改该值。这样的语句在Swift 3.0.1中不存在。