Swift中的"with"关键字

11
在Swift中,“with”关键字的目的是什么?到目前为止,我发现该关键字可用于覆盖现有的全局函数,例如toDebugString。
    // without "with" you get "Ambiguous use of 'toDebugString'" error
    func toDebugString<T>(with x: T) -> String

    {
        return ""
    }

    toDebugString("t")
1个回答

34

with 不是关键字 - 它只是一个外部参数标识符。这也可以工作:

func toDebugString<T>(whatever x: T) -> String

由于toDebugString<T>(x: T)函数已经被定义,通过使用一个外部参数,你正在创建一个重载:相同的函数名称,但不同的参数。在这种情况下,参数是相同的,但使用外部名称标识,并且在Swift中,它成为具有不同签名的方法,因此是一个重载。

为了证明这一点,请将以下内容粘贴到Playground中:

func toDebugString<T>(# x: T) -> String {
    return "overload"
}

toDebugString(x: "t") // Prints "overload"
toDebugString("t") // Prints "t"

第一个调用你的重载实现,而第二个使用已经存在的函数。
建议阅读:函数参数名称

看起来参数名称信息已经被分成了自己的页面。你所指的“外部参数标识符”是否与“参数标签”相同--“默认情况下,参数使用它们的参数名称作为它们的参数标签”?有趣的是,在Swift中,您可以使用参数名称重载函数,而不仅仅是参数和类型。仍然有点困惑;你能叫toDebugString(#: "t")吗?我认为是的。 - ruffin
自从我回答后,有些事情略有改变。是的,现在外部参数标识符被称为参数标签,并且不再使用 # 字符——它曾用于指示参数标签用于内部和外部名称(请参见此答案进行解释)。你调用函数的方式是行不通的,你必须使用外部参数名 x,即 toDebugString(x: "t") - Antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接