我是快速编程的新手。如何将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 ^
答案 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中,可变参数(如print
和myPrint
的参数#1)消耗所有参数,直到达到标签。如果您尝试调用myPrint("hello", " ", "\n")
,则所有三个参数都将分配给参数#1,并且不会将任何内容分配给参数#2和#3。
由于您无法在闭包中标记参数,因此无法通过无法调用myPrint
闭包,因为无法传递参数#2和#3的值。