我会说函数类型最适合the definition of a reference type:
引用类型在分配给变量或常量或传递给函数时不会被复制。使用对相同现有实例的引用而不是副本。
但是我不认为这是一个特别有用的区别,IMO 也可以将函数作为值类型的论点(如technically speaking they consist of a pointer and a reference,当函数值传递时两者都被复制)大约)。
更有用的区别是函数具有引用语义,这意味着可以观察实例之间的某种共享状态。这与引用类型不同——值类型可能具有引用语义,而引用类型可能具有值语义。
例如,这是一个具有引用语义的值类型:
var foo = 0
struct S {
var bar: Int {
get { return foo }
nonmutating set { foo = newValue }
}
}
let s = S()
let s1 = s
s.bar += 1
print(s.bar) // 1
print(s1.bar) // 1
s 和 s1 共享全局状态,这可以通过改变它来观察。
这是一个具有值语义的引用类型:
final class C {
let foo = 0
}
let c = C()
let c1 = c
print(c.foo) // 0
print(c1.foo) // 0
虽然c 和c1 共享状态,但这不是直接可观察的,因为共享状态是不可变的。
那么,为什么函数有引用语义呢?因为它们可以包含捕获的变量,这是可以观察到的共享可变状态。
例如:
func makeFn() -> () -> Int {
var foo = 0
return {
foo += 1
return foo
}
}
let fn = makeFn()
let fn1 = fn
print(fn()) // 1
print(fn1()) // 2