0

我可以在结构中编写变异函数,但不能在课堂上编写。

struct Stack {
    public private(set) var items = [Int]() // Empty items array

    mutating func push(_ item: Int) {
        items.append(item)
    }

    mutating func pop() -> Int? {
        if !items.isEmpty {
           return items.removeLast()
        }
        return nil
    }
}
4

3 回答 3

0

在swift中,类是引用类型,而结构和枚举是值类型。默认情况下,值类型的属性不能在其实例方法中修改。为了修改值类型的属性,您必须在实例方法中使用 mutating 关键字。使用此关键字,您的方法就可以在方法实现结束时改变属性的值并将其写回原始结构。

于 2020-02-13T12:40:32.347 回答
0

如果将结构更改为类,只需删除mutating出现的关键字即可。

于 2020-02-13T12:40:39.187 回答
0

那是因为类是引用类型,而结构是值类型。

struct TestValue {
    var a : Int = 42

    mutating func change() { a = 1975 }
}

let val = TestValue()
val.a = 1710 // Forbidden because `val` is a `let` of a value type, so you can't mutate it
val.change() // Also forbidden for the same reason

class TestRef {
    var a : Int = 42

    func change() { a = 1975 }
}

let ref = TestRef()
ref.a = 1710 // Allowed because `ref` is a reference type, even if it's a `let`
ref.change() // Also allowed for the same reason

所以在类上,你不需要指定一个函数是否正在变异,因为即使用let变量定义,你也可以修改实例......

这就是为什么mutating关键字在类上没有意义的原因。

于 2020-02-13T12:57:44.150 回答