他们表达不同的东西。与
func check(object: inout Healthy) {
object 参数可以是任何符合Healthy 的实例。因此,您可以这样做:
protocol Healthy {}
struct Foo : Healthy {}
struct Bar : Healthy {}
func check(object: inout Healthy) {
object = Bar()
}
var h: Healthy = Foo()
check(object: &h)
print(h) // Bar()
我们调用了check(object:) 并将h(它包含一个Foo 实例)作为inout 参数传递,但最终h 包含一个Bar 实例。
您会注意到,这意味着我们不能简单地使用具体类型的inout 参数调用check(object:)。以下内容无法编译:
var h = Foo()
// compiler error: Cannot pass immutable value as inout argument:
// implicit conversion from 'Foo' to 'Healthy' requires a temporary
check(object: &h)
因为check(object:) 可以将一个任意符合Healthy 的实例分配给object 参数,而该参数不能分配给Foo 变量。
然而,与
func check<T : Healthy>(object: inout T) {
object 参数是符合Healthy 的单个特定 具体类型(并且该类型在调用站点得到满足)。您不能只为其分配符合 Healthy 的任意实例,因为它可能与作为 inout 参数传递的变量类型不兼容。
因此,现在您可以使用具体类型的 inout 参数调用它。我们现在可以说:
protocol Healthy {
var alive: Bool { get set }
}
struct Foo : Healthy {
var alive: Bool
}
struct Bar : Healthy {
var alive: Bool
}
func check<T : Healthy>(object: inout T) {
object.alive = false
// illegal
// object = Bar()
}
var h = Foo(alive: true)
check(object: &h)
(注意h 可以输入为Foo)
因此,在大多数情况下,您可能希望使方法成为通用方法,而不是使用协议类型的 inout 参数,因为您可能希望处理具体类型。