【问题标题】:Assign print function to a variable将打印函数分配给变量
【发布时间】:2018-01-19 03:34:49
【问题描述】:

我是 swift 编程新手。如何将打印功能分配给变量并在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 = 打印 ^

【问题讨论】:

  • 欢迎堆栈溢出!您需要准确地告诉我们错误消息的内容,而不是说“此行显示错误”。我将您的代码输入到 Swift 解释器中,并且没有任何错误。
  • 当我将另一个字符串 "hello" 作为 #2 像 myPrint("welcome to swift", "hello") 一样传递时,错误显示“在调用中缺少参数 #2 的参数”,它再次显示相同错误
  • @robmayoff 我刚刚用相同的代码复制了同样的问题——问题包括复制它所需的所有数据。更新了问题以反映它。

标签: swift


【解决方案1】:

我相信您已经发现了 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)消耗 所有 参数,直到 in 到达标签。如果您尝试调用myPrint("hello", " ", "\n"),则所有三个参数都将分配给参数#1,而不会将任何内容分配给参数#2 和#3。

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

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

【讨论】:

    【解决方案2】:

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

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

    所以myPrint 的类型是(Any..., String, String) -> ()。这很难调用,因为在Any... 吸完所有参数后还需要两个参数。闭包目前不允许命名参数,所以让它工作充其量是困难的,最坏的情况是不可能的。

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

    let myPrint = { print($0) }
    

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多