【问题标题】:Selecting global or object print function选择全局或对象打印功能
【发布时间】:2015-06-20 15:46:37
【问题描述】:

我正在使用 Swift 开发一个 Cocoa 项目,但遇到了以下问题:

Cocoa 框架中的几个类(例如NSWindowNSView)实现了一个名为print: 的函数,它打开一个窗口以打印一些东西(不知道是什么),所以当我在其中工作时从这些类之一继承的类,并且想要将某些内容记录到控制台以进行调试,我使用 print: 函数。但是编译器认为我指的是self.print:,虽然我指的是全局打印函数。

我通过声明一个全局函数找到了一种解决方法,如下所示:

func myPrint(o : Any?)
{
     print(o)
}

如果编译器会混淆我指的是哪个函数,请使用myPrint: 而不是print:。我很确定在这种情况下可能还有其他功能,而不是print:。我的解决方法或覆盖继承的 print: 函数是唯一的解决方案,还是我可以以某种方式给编译器一个提示,说我想引用全局 print: 函数?

PS:我使用的是 Swift 2.0,所以 println: 不可用。

【问题讨论】:

    标签: swift cocoa swift2


    【解决方案1】:

    确实,NSView 有一个

    func print(_ sender: AnyObject?)
    

    打开打印面板的方法,很不幸的巧合。

    你的myPrint() 包装器有一些限制,例如

    myPrint("b", appendNewline : false)
    

    不编译。更好的实现是

    func myPrint<T>(o : T, appendNewline nl: Bool = true) {
        print(o, appendNewline: nl)
    }
    

    但是您可以简单地在模块名称“Swift”前面加上明确地引用全局函数:

    Swift.print("xxx")
    

    【讨论】:

      【解决方案2】:

      如果您的目标只是将输出写入控制台,我将在此处使用备用全局函数 debugPrint(_:)

      【讨论】:

      • 一个漂亮的解决方法。我很感兴趣,你为什么用“如果你的目标只是将输出写入控制台”来限定你的答案?这肯定是print 的主要用例吗?
      • 主要是为了语义 :) 并且因为,正如 OP 所提到的,AppKit 中的某些类似乎为了自己的目的而重载了 print(_:)
      • 它还会添加一个换行符,而 print 除非明确指定。
      猜你喜欢
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多