在Swift中,我有一个自定义的Deque struct ,其中包含各种用于添加和删除元素的变异方法.当我链接Deque.pushBack(contentsOf:.)等方法调用时,我遇到错误"无法在不可变值上使用变异成员:函数调用返回不可变值."然而,当我对b这样的变量使用相同的链接模式时,它工作得很好.有人能解释一下为什么会发生这种情况吗?与匹配函数是全局函数有关吗?如何解决这个问题?
struct Deque {
private var arrayDeque: [Int] = []
mutating func pushFront(_ element: Int) {
arrayDeque.insert(element, at: 0)
}
@discardableResult
mutating func pushFront(contentsOf elements: Int...) -> Deque {
for element in elements.reversed() {
pushFront(element)
}
return self
}
mutating func pushBack(_ element: Int) {
arrayDeque.append(element)
}
@discardableResult
mutating func pushBack(contentsOf elements: Int...) -> Deque {
for element in elements {
pushBack(element)
}
return self
}
@discardableResult
mutating func popFront() -> Deque? {
guard !isEmpty else { return nil }
var copy = self
copy.arrayDeque.removeFirst()
return copy
}
@discardableResult
mutating func popBack() -> Deque? {
guard !isEmpty else { return nil }
var copy = self
copy.arrayDeque.removeLast()
return copy
}
var isEmpty: Bool {
return arrayDeque.isEmpty
}
var count: Int {
return arrayDeque.count
}
func peekFront() -> Int? {
return arrayDeque.first
}
func peekBack() -> Int? {
return arrayDeque.last
}
}
func match(_ xs: Deque) -> Bool { ... }
// gives me error
let a = match(Deque().pushBack(contentsOf: 1, 2, 1, 2, 1))
// works fine
var b = Deque()
let b2 = b.pushBack(contentsOf: 1, 2, 1, 2, 1)
let b3 = match(b2)
错误:无法对不可变值使用变异成员:函数调用返回不可变值
我试图理解为什么Swift在这些场景中的行为不同,以及如何在链接方法调用自定义数据 struct 时确保行为一致.任何见解或解释都将不胜感激!(我是新手,如果你能用基本术语解释一下那就太好了,谢谢)
还聊天GPT解释:"实例的可变性:如果您在实例上链接可变方法,请确保实例本身是可变的(用var声明).否则,您将无法应用方法所做的更改.",以及关于如何"的一些内容是因为在Swift中,当您像示例a中那样链接方法调用时,中间结果是不可变的."