swift - swift 中的功能类型注释

标签 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

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/

相关文章:

functional-programming - 了解 Elm 的类型签名返回类型

javascript - JavaScript 中的函数组合

ios - CNContactViewController 按钮 Action

swift - 用变量填充结构

ios - 具有单选和多选的 UITableView 部分

ios - swift 改变语言

r - 如何使用解析的变量打印函数体

ios - "Initializer for conditional binding must have Optional type, not ' [字符串] '"

ios - 如何将 ImageView 转换并放大为形状(swift3)

ios - 将 UITableView 单元格文本字段值添加到数组? ( swift )