我是快速编程的新手。如何将打印函数分配给变量并在 swift 中通过该变量调用?
var myPrint = print
myPrint("calling print function")//This line shows error
第二行 (myPrint("calling print function")
) 显示此错误:
调用中缺少参数 #2 的参数
操场执行失败: 错误: TestingPlayground.playground:5:33: 错误: 调用中缺少参数 #2 的参数 myPrint("调用打印函数") ^ , TestingPlayground.playground:4:5:注意:此处声明"myPrint" var myPrint = print ^
我相信你已经发现了 Swift 编译器的一个已知错误(或限制)。
内置print
函数有三个参数。参数 #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)使用所有参数,直到 in 到达标签。如果尝试调用myPrint("hello", " ", "n")
,则所有三个参数都将分配给参数 #1,而不会将任何参数分配给参数 #2 和 #3。
由于不能在闭包中使用标记参数,因此无法调用myPrint
闭包,因为无法传递参数 #2 和 #3 的值。
这是一个已知的限制。请参阅 SR-2475 和 SR-494。
print
包含一个可变参数,后跟具有默认值的命名参数,这意味着很难以这种方式使用对它的引用。print
的签名是:
public func print(_ items: Any..., separator: String = default, terminator: String = default)
所以myPrint
的类型是(Any..., String, String) -> ()
.这很难调用,因为在Any...
吸完所有参数后还需要两个参数。闭包目前不允许命名参数,因此使其工作在最好的情况下是困难的,在最坏的情况下是不可能的。
在 Swift 中执行此操作的方法是创建包装闭包:
let myPrint = { print($0) }