将打印功能分配给变量

时间:2018-01-18 18:45:05

标签: swift

我是快速编程的新手。如何将print函数分配给变量并通过swift中的变量调用?

var myPrint = print
myPrint("calling print function")//This line shows error

第二行(myPrint("calling print function"))显示此错误:

  

在呼叫

中缺少参数#2的参数
Playground execution failed:

error: TestingPlayground.playground:5:33: error: missing argument for parameter #2 in call
myPrint("calling print function")
                                ^
                                , 

TestingPlayground.playground:4:5: note: 'myPrint' declared here
var myPrint = print
    ^

2 个答案:

答案 0 :(得分:2)

print包含一个可变参数,后跟带有默认值的命名参数,这意味着很难以这种方式使用它的引用。 print的签名是:

public func print(_ items: Any..., separator: String = default, terminator: String = default)

因此myPrint的类型为(Any..., String, String) -> ()。这很难调用,因为Any...吸取了所有参数后还需要两个参数。闭包目前不允许使用命名参数,因此最好不要这样做,最坏的情况是不可能的。

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

let myPrint = { print($0) }

答案 1 :(得分:2)

我相信您已经找到了Swift编译器的已知错误(或限制)。

The built-in print function有三个参数。参数#1未标记,类型为String ...(可变参数)。参数#2具有标签separator,类型为String,并且具有默认值。参数#3具有标签terminator,类型为String,并且具有默认值。由于参数#2和#3具有默认值,因此您可以将其称为print("hello")

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

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

由于您无法在闭包中标记参数,因此无法通过无法调用myPrint闭包,因为无法传递参数#2和#3的值。

这是一个已知的限制。请参阅SR-2475SR-494