swift中的函数类型标注
要调用带参数的函数,它需要在Swift 3.0中将每个参数一起写入。 但一旦使用类型注释将函数赋值给常量,就不需要写入每个参数。为什么?swift中的函数类型标注,swift,functional-programming,swift3,Swift,Functional Programming,Swift3,要调用带参数的函数,它需要在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
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!
当你做“速记”时,你正在创建一个“s”,它是一个泛型类型,任何函数都满足签名要求,输入参数类型为Int,没有返回值
当您将foo指定给该常量时,您就满足了类型要求,并且foo现在“嵌套”在s中
也许…当你做“速记”时,你正在创建一个“s”,它是一个泛型类型,任何函数都满足签名要求,即输入参数类型为Int,没有返回值
当您将foo指定给该常量时,您就满足了类型要求,并且foo现在“嵌套”在s中
也许…因为您可以将更具体的对象分配给更一般类型的变量(例如,将子类对象分配给超类变量,但我们这里不讨论类),但反之亦然
(base:Int)->()
是一般(Int)->()
函数的一个更具体的情况。因此,任何(base:Int)->()
都是(Int)->()
函数,但任何(Int)->()
函数都不是(base:Int)->()
函数
稍后,当您使用创建的变量时,Swift会根据其类型对其进行处理。如果它是(base:Int)->()
,则参数名是必需的,否则它不是必需的
因此,在第一种情况下,您显式地将变量声明为(Int)->()
,并相应地使用它。Swift不对这些行进行任何假设:
s(5) // SUCCESS!
s(base:5) // Error!
它只知道变量的类型是(Int)->()
。它可以是任何其他的(Int)->()
函数,比如(无论什么:Int)->()
在第二种情况下,变量显式创建为(base:Int)->()
,因此要使用它,应该指定名称
在第三种情况下,变量隐式创建为
(base:Int)->()
(Swift自动推断类型)。因为您可以将更具体的对象分配给更一般类型的变量(例如,将子类对象分配给超类变量,但我们这里不讨论类),反之亦然
(base:Int)->()
是一般(Int)->()
函数的一个更具体的情况。因此,任何(base:Int)->()
都是(Int)->()
函数,但任何(Int)->()
函数都不是(base:Int)->()
函数
稍后,当您使用创建的变量时,Swift会根据其类型对其进行处理。如果它是(base:Int)->()
,则参数名是必需的,否则它不是必需的
因此,在第一种情况下,您显式地将变量声明为(Int)->()
,并相应地使用它。Swift不对这些行进行任何假设:
s(5) // SUCCESS!
s(base:5) // Error!
它只知道变量的类型是(Int)->()
。它可以是任何其他的(Int)->()
函数,比如(无论什么:Int)->()
在第二种情况下,变量显式创建为(base:Int)->()
,因此要使用它,应该指定名称
在第三种情况下,变量隐式创建为
(base:Int)->()
(Swift自动推断类型)。您可以使用let s:(base:Int)->()=foo
或干脆let s=foo
。但请注意,在Swift 3的未来版本中将不允许为函数类型提供参数名称–请参阅。您可以使用let s:(base:Int)->()=foo
或干脆让s=foo
。但请注意,在Swift 3的未来版本中,不允许为函数类型提供参数名称–请参阅。