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

为什么Swift需要显式参数类型,即使它们可以从默认值推断出来?,swift,language-design,Swift,Language Design,从Swift语言的第6页开始,很明显,语言设计者为这样一个事实感到自豪:虽然Swift是强类型的,但程序员通常不必担心类型,因为它们是从上下文推断出来的 因此,我觉得奇怪的是,即使默认参数值使参数类型清晰,也需要显式类型 例如,此声明中需要字符串: func assign(motto: String = "Winter is coming") { /* ... */ } 尽管格言的类型在这里很清楚: func assign(motto = "Winter is coming") { /* ..

从Swift语言的第6页开始,很明显,语言设计者为这样一个事实感到自豪:虽然Swift是强类型的,但程序员通常不必担心类型,因为它们是从上下文推断出来的

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

例如,此声明中需要字符串:

func assign(motto: String = "Winter is coming") { /* ... */ }
尽管格言的类型在这里很清楚:

func assign(motto = "Winter is coming") { /* ... */ }
而且比法律法规更容易阅读

你知道或者你能想象这是为什么吗

我在这一领域的进化中找不到任何变化要求。()

一次调查

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

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

    /* ... */

}
但是,这种危险并没有在变量声明中困扰语言设计者。这是合法的:

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

一个原因可能是为了让阅读您的代码的人的生活更轻松

假设我正在读你的代码,我看到了

func foo(param = bar.baz) { 
我需要一秒钟的时间才能意识到
param
是什么类型。我需要转到
bar.baz
的定义,看看它是什么类型

与变量声明不同,参数的类型更为重要,因为方法的用户需要知道类型,以便知道传递给方法的内容


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


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

很有意义。我不知道非文本可以是合法的默认值。