将打印功能分配给变量



我是快速编程的新手。如何将打印函数分配给变量并在 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 中,可变参数(如printmyPrint的参数 #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) }

最新更新