要调用带参数的函数,需要在Swift 3.0 中将每个参数写在一起。 但是一旦将函数赋值给带有类型注解的常量,就不需要再写每个参数了。为什么?
func foo(base : Int) {
print ("param = \(base)")
}
// Case 1
let s : (Int) -> () = foo
s(5) // SUCCESS!
s(base:5) // Error!
// Case 2
let k : (base: Int) -> () = foo
k(5) // Error!
k(base: 5) // SUCCESS!
// Case 3
let t = foo
t(5) // Error!
t(base: 5) // SUCCESS!
最佳答案
因为您可以将更具体的对象分配给更通用类型的变量(例如,将子类对象分配给父类(super class)变量,但我们这里不讨论类),反之亦然。
(base: Int) -> ()
是一般 (Int) -> ()
函数的更具体情况。因此,任何 (base: Int) -> ()
都是 (Int) -> ()
函数,但不是任何 (Int) -> ()
函数是一个 (base: Int) -> ()
函数。
稍后,当您使用您创建的变量时,Swift 会根据它的类型来处理它。如果是(base: Int) -> ()
,那么参数名是必须的,否则不是必需的。
因此,在第一种情况下,您显式地将变量声明为 (Int) -> ()
并相应地使用它。 Swift 不会对这些行做出任何假设:
s(5) // SUCCESS!
s(base:5) // Error!
它只知道变量的类型是(Int) -> ()
。它可以是任何其他 (Int) -> ()
函数,例如 (whatever: Int) -> ()
。
在第二种情况下,变量显式创建为 (base: Int) -> ()
,因此要使用它,应指定名称。
在第三种情况下,变量隐式创建为 (base: Int) -> ()
(Swift 自动推断类型)。
关于swift - swift 中的功能类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38431901/