Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift中的函数类型标注_Swift_Functional Programming_Swift3 - Fatal编程技术网

swift中的函数类型标注

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

要调用带参数的函数,它需要在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! 
当你做“速记”时,你正在创建一个“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的未来版本中,不允许为函数类型提供参数名称–请参阅。