Swift: 为什么变异函数不能是静态的
Swift: why mutating function can not be static
我有一个理论问题,我没有找到相关主题。
在某些时候,我决定为数组做一个小扩展会很好:
var array = [Int]()
array += 1
代码很简单:
extension Array {
mutating static func +=(lhs: Array, rhs: Element) {
lhs.append(rhs)
}
}
为了实现这一目标,我们结合了两个对我来说非常有意义的因素:
- 数组是一个结构体,此操作需要突变
- 中缀运算符重载需要静态函数
不幸的是,这是不可能的,因为 Swift 不允许变异函数是静态的。这是我不太明白的部分。
您的 +=
改变了第一个参数,而不是 Array
类型。
因此它不能被声明为变异(这使得没有
对静态方法有意义,因为你不能改变类型),但第一个参数必须是 inout
:
extension Array {
static func +=(lhs: inout Array, rhs: Element) {
lhs.append(rhs)
}
}
var array = [Int]()
array += 1
print(array) // [1]
因为 mutating
并不意味着 "mutates anything",而是 "mutates self
"。您的函数试图改变 lhs
,而不是 self
。
您当前的代码将无法运行,因为 lhs
正在按值传递。 lhs
参数是调用者提供给它的任何参数的本地副本,因此您的函数所做的任何更改都将是函数的本地更改,不会持续存在。您需要改为通过引用传递 lhs
,将其定义为 inout Array
.
通过在方法名称之前使用 static 关键字意味着,我们通过 struct/class 名称调用方法(而不是通过对象),因此我们这里没有任何对象。
通过使用 mutating 关键字,我们正在改变 'self' 对象。
因此,在使用 static 时,我们没有任何对象可以改变。
我有一个理论问题,我没有找到相关主题。
在某些时候,我决定为数组做一个小扩展会很好:
var array = [Int]()
array += 1
代码很简单:
extension Array {
mutating static func +=(lhs: Array, rhs: Element) {
lhs.append(rhs)
}
}
为了实现这一目标,我们结合了两个对我来说非常有意义的因素:
- 数组是一个结构体,此操作需要突变
- 中缀运算符重载需要静态函数
不幸的是,这是不可能的,因为 Swift 不允许变异函数是静态的。这是我不太明白的部分。
您的 +=
改变了第一个参数,而不是 Array
类型。
因此它不能被声明为变异(这使得没有
对静态方法有意义,因为你不能改变类型),但第一个参数必须是 inout
:
extension Array {
static func +=(lhs: inout Array, rhs: Element) {
lhs.append(rhs)
}
}
var array = [Int]()
array += 1
print(array) // [1]
因为 mutating
并不意味着 "mutates anything",而是 "mutates self
"。您的函数试图改变 lhs
,而不是 self
。
您当前的代码将无法运行,因为 lhs
正在按值传递。 lhs
参数是调用者提供给它的任何参数的本地副本,因此您的函数所做的任何更改都将是函数的本地更改,不会持续存在。您需要改为通过引用传递 lhs
,将其定义为 inout Array
.
通过在方法名称之前使用 static 关键字意味着,我们通过 struct/class 名称调用方法(而不是通过对象),因此我们这里没有任何对象。
通过使用 mutating 关键字,我们正在改变 'self' 对象。
因此,在使用 static 时,我们没有任何对象可以改变。