Swift 将打印函数指定给变量

Swift 将打印函数指定给变量,swift,Swift,我是swift编程新手。如何在swift中将打印函数分配给变量并通过该变量调用 var myPrint = print myPrint("calling print function")//This line shows error 第二行(myPrint(“调用打印函数”))显示此错误: 调用中缺少参数#2的参数 游乐场执行失败: 错误:TestingPlayerly.Playerly:5:33:错误:调用中缺少参数#2的参数 myPrint(“调用打印函数”) ^ , 测试操场。操场:4

我是swift编程新手。如何在swift中将打印函数分配给变量并通过该变量调用

var myPrint = print
myPrint("calling print function")//This line shows error
第二行(
myPrint(“调用打印函数”)
)显示此错误:

调用中缺少参数#2的参数

游乐场执行失败: 错误:TestingPlayerly.Playerly:5:33:错误:调用中缺少参数#2的参数 myPrint(“调用打印函数”) ^ , 测试操场。操场:4:5:注:此处声明“myPrint” var myPrint=print ^
print
包含一个可变参数,后跟带有默认值的命名参数,这意味着很难用这种方式引用它。
打印
的签名为:

public func print(_ items: Any..., separator: String = default, terminator: String = default)
因此,
myPrint
的类型是
(任意…,字符串,字符串)->()
。这很难调用,因为在
Any…
吸收了所有参数之后,还需要两个参数。闭包目前不允许使用命名参数,因此使其工作在最好的情况下是困难的,在最坏的情况下是不可能的

在Swift中执行此操作的方法是创建包装封口:

let myPrint = { print($0) }

我相信您已经发现了Swift编译器的一个已知缺陷(或限制)

有三个参数。参数#1未标记,类型为
字符串…
(可变)。参数#2具有标签
分隔符
,类型为
字符串
,具有默认值。参数#3具有标签
终止符
,类型为
字符串
,具有默认值。由于参数#2和#3具有默认值,因此可以像
print(“hello”)
那样调用它

闭包(如
myPrint
)不能使用带标签的参数。因此,
myPrint
接受三个未标记的参数。参数#1的类型为
字符串…
(可变)。参数#2的类型为
String
。参数#3也是类型
String
。闭包参数不能有默认值,因此
myPrint
需要所有三个参数。您不能像
myPrint(“hello”)
那样调用它,因为您没有为参数2和3传递任何内容,并且它们没有(也不能)默认值

在Swift中,可变参数(如
print
myPrint
的参数#1)消耗所有参数,直到In到达标签。如果尝试调用
myPrint(“hello”、“”、“\n”)
,则所有三个参数都将分配给参数#1,而参数#2和#3将不分配任何内容

由于闭包中不能有带标签的参数,因此无法调用
myPrint
闭包,因为无法传递参数#2和#3的值


这是一个已知的限制。请参阅和。

欢迎使用堆栈溢出!您需要准确地告诉我们错误消息的内容,而不是说“这行显示错误”。我在Swift解释器中输入了您的代码,它没有错误。当我将另一个字符串“hello”传递为像myPrint(“欢迎使用Swift”,“hello”)一样的#2时,错误显示为“调用中缺少参数#2的参数”,它再次显示了相同的结果error@robmayoff我刚刚重复了同样的问题,使用相同的代码-问题包括复制它所需的所有数据。已更新问题以反映它。还比较相关:。
let myPrint = { print($0) }