Swift:为什么变异函数不能是静态的

时间:2017-11-10 14:32:53

标签: swift operators value-type

我有一个理论问题,我找不到相关主题。

在某些时候,我认为为数组添加一个小扩展会很好:

var array = [Int]()
array += 1

代码非常简单:

extension Array {
    mutating static func +=(lhs: Array, rhs: Element) {
        lhs.append(rhs)
    }
}

为实现这一目标,我们选择了两个对我来说非常有意义的因素:

  • Array是一个结构,此操作需要一个变异
  • 中缀操作员重新加载需要静态功能

不幸的是,由于Swift不允许变异函数是静态的,所以不可能。这是我不太了解的部分。

3 个答案:

答案 0 :(得分:2)

您的+=会改变第一个参数,而不是Array类型。 因此,不得宣布变异(这不是 感觉静态方法,因为你不能改变类型),但第一个参数必须是inout

extension Array {
    static func +=(lhs: inout Array, rhs: Element) {
        lhs.append(rhs)
    }
}

var array = [Int]()
array += 1
print(array) // [1]

答案 1 :(得分:1)

因为mutating并不意味着“改变任何东西”,而是“变异self”。您的函数会尝试改变lhs,而不是self

您当前的代码无效,因为lhs正在按值传递。 lhs参数是调用者提供给它的任何参数的本地副本,因此您的函数所做的任何更改都将是函数的本地更改,并且不会持久存在。您需要通过引用将lhs传递给inout Array

答案 2 :(得分:0)

通过在方法名称表示之前使用static关键字,我们按结构/类名称(而不是对象)调用方法,因此此处没有任何对象。
通过使用mutating关键字,我们可以对'self'对象进行突变。 因此,在使用静态时,我们没有任何对象可以变异。