2015-06-20 34 views
2

我跟在斯威夫特可可项目的工作和面临以下问题:选择全球或对象打印功能

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

我找到了一个解决方法通过声明一个全局函数,像这样:

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

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

PS:我使用的是Swift 2.0,因此println:不可用。

回答

9

事实上,NSView具有

func print(_ sender: AnyObject?) 

方法打开打印面板,其是一个不幸conincidence。

myPrint()包装有一定的局限性,例如

myPrint("b", appendNewline : false) 

不能编译。更好的实现是

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

你可以简单地在前面加上模块名称“雨燕”来指代全局函数明确:

Swift.print("xxx") 
3

如果你的目标很简单,就是输出写入控制台,我会在这里使用备用全局函数debugPrint(_:)

+0

一个美丽的解决方法。我感兴趣为什么你用“如果你的目标只是把输出写到控制台”来限定你的答案?无论如何,这肯定是'print'的主要用例呢? –

+0

主要用于语义:),因为如OP所述,AppKit中的某些类似乎为自己的目的而重载'print(_ :)' – fqdn

+0

它也添加了一个换行符,而print除非明确指定否则不会。 – user965972