Swift 将函数赋值给变量时出错

Swift 将函数赋值给变量时出错,swift,Swift,我有如下简单代码: var println = print; println("test"); 它给了我一个错误:调用中缺少参数#2的参数。我添加了更多的论点: println("test",".","\n"); 它仍然给我同样的错误。为什么会发生这种情况?以下是打印功能的定义: public func print(_ items: Any..., separator: String = default, terminator: String = default) 当您获得对它的引用时,您

我有如下简单代码:

var println = print;
println("test");
它给了我一个错误:
调用中缺少参数#2的参数
。我添加了更多的论点:

println("test",".","\n");

它仍然给我同样的错误。为什么会发生这种情况?

以下是打印功能的定义:

public func print(_ items: Any..., separator: String = default, terminator: String = default)
当您获得对它的引用时,您放弃了命名参数,因此所有输入都被视为
项的元素
,因为
Any…
不是预定义的参数量。在这样的定义中,没有办法提供分隔符和终止符

如Swift所示,Her是功能类型:

打印
println

以下是
打印功能的定义:

public func print(_ items: Any..., separator: String = default, terminator: String = default)
当您获得对它的引用时,您放弃了命名参数,因此所有输入都被视为
项的元素
,因为
Any…
不是预定义的参数量。在这样的定义中,没有办法提供分隔符和终止符

如Swift所示,Her是功能类型:

打印
println

除非有非常具体的原因需要这样做,否则这应该可以实现所需的功能,尽管是以一种更迂回的方式:

func println (_ items: Any..., separator: String = " ", terminator: String = "\n") {
    for item in items {
        print(item, separator: separator, terminator: "")
    }
    print(terminator, separator: "", terminator: "")
}
println("test")
println("test",".","\n")

除非有非常具体的原因需要这样做,否则这应该以更迂回的方式实现所需的功能:

func println (_ items: Any..., separator: String = " ", terminator: String = "\n") {
    for item in items {
        print(item, separator: separator, terminator: "")
    }
    print(terminator, separator: "", terminator: "")
}
println("test")
println("test",".","\n")

在您的错误消息下方,在调用中的
之后,是否有一个
^
专门指向
println
调用,或者是否有另一个引用?您使用
var println=print
的具体目标是什么。为什么不使用
typealias
?尽管我也很好奇您在这里想做什么。问题是,Swift目前没有为您编写thunk来传播默认函数参数值,因此您只需获取不带任何默认参数的函数引用(例如用于
分隔符:
终止符:
)。您可以简单地将它包装在一个闭包中,以获得这个thunk–例如
let println={print($0)}
。虽然这只处理一个要打印的参数,而不是可变列表(而且您将无法提供自己的终止符或分隔符)。@Hamish觉得很有趣。。。这是功能参考的设计缺陷吗?它已损坏且无法工作?@texasbruce我不会确切地将其称为设计缺陷——只是目前没有语言功能允许您这么做(它可能需要某种形式的特殊语法)。虽然闭包的“可变参数后跟其他参数”的情况肯定是不正确的。在调用中的
之后的错误消息下面,它是否有一个
^
专门指向一个
println
调用,或者是否有另一个引用?您使用
var println=print
的目标是什么。为什么不使用
typealias
?尽管我也很好奇您在这里想做什么。问题是,Swift目前没有为您编写thunk来传播默认函数参数值,因此您只需获取不带任何默认参数的函数引用(例如用于
分隔符:
终止符:
)。您可以简单地将它包装在一个闭包中,以获得这个thunk–例如
let println={print($0)}
。虽然这只处理一个要打印的参数,而不是可变列表(而且您将无法提供自己的终止符或分隔符)。@Hamish觉得很有趣。。。这是功能参考的设计缺陷吗?它已损坏且无法工作?@texasbruce我不会确切地将其称为设计缺陷——只是目前没有语言功能允许您这么做(它可能需要某种形式的特殊语法)。虽然闭包的“可变参数后跟其他参数”的情况肯定被打破了。因此,这就产生了一个漏洞,当您使用vardiac params引用像这样的func时,您将永远无法成功调用它?我注意到当你引用func时,它总是会掉标签?对。我用图像更新了答案,以显示代码转换后
print
println
的实际函数签名。我想你需要为它建立一个雷达。我假设这样的赋值应该继承原始函数的所有属性。@texasbruce我想我的答案就是你问题的答案?;)这就造成了一个漏洞,当你使用vardiac参数引用这样一个func时,你将永远无法成功调用它?我注意到当你引用func时,它总是会掉标签?对。我用图像更新了答案,以显示代码转换后
print
println
的实际函数签名。我想你需要为它建立一个雷达。我假设这样的赋值应该继承原始函数的所有属性。@texasbruce我想我的答案就是你问题的答案?;)