为什么即使可以从默认值推断出Swift,也需要显式的参数类型?

时间:2018-12-15 15:12:37

标签: swift language-design

The Swift Language 中的第6页开始,很明显,语言设计者为自己感到自豪,因为Swift是强类型的,程序员通常不必担心类型,因为它们是根据上下文推断的。

我觉得很奇怪,因此即使默认参数值使参数类型清晰也需要显式类型。

例如,此声明中需要 String

func assign(motto: String = "Winter is coming") { /* ... */ }

即使座右铭的类型在这里很清楚:

func assign(motto = "Winter is coming") { /* ... */ }

并且比法律法规更易于阅读。

您知道还是可以想象这是为什么?

在该区域的Evolution中我找不到任何更改请求。 (https://apple.github.io/swift-evolution

一次调查

我的第一个想法是允许程序员省略参数类型将允许他们在参数声明中构建复杂的类型,这可能很难理解:

func update(inventory = [
    ("Daenerys", ("dragons", -1)), 
    ("Cersei", ("children", -3))
    ]) {

    /* ... */

}

但是,这种危险不会干扰语言设计人员的变量声明。这是合法的Swift:

var houseData = [
    ["Stark": ["Sigil": "Dyer Wolf", "Motto": "Winter is coming"]],
    ["Lannister": [
        "Sigil": "Lion", 
        "Motto": "Hear me roar", 
        "Saying": "A Lannister pays his debts"
    ]]
]

1 个答案:

答案 0 :(得分:2)

一个原因可能是使阅读您的代码的人的生活更轻松。

假设我正在阅读您的代码,并且看到了

func foo(param = bar.baz) { 

我需要花一秒钟的时间才能知道param是什么类型。我需要转到bar.baz的定义,看看它是什么类型。

与变量声明不同,参数的类型更为重要,因为方法的用户需要知道类型,以便他们知道将什么传递给您的方法。


此外,使参数类型成为必需的也使spec的编写更加简单。只有一种情况:

enter image description here

否则,将有两种情况:一种带有可选的类型注释,另一种带有可选的默认参数子句。