2017-06-02 59 views
1

时,我有简单的代码如下:错误分配函数变量

var println = print; 
println("test"); 

它给我的错误:missing argument for parameter #2 in call。我添加了更多参数:

println("test",".","\n"); 

它仍然给我同样的错误。为什么会发生?

+0

在您的错误消息之下,'我n call',它是否有专门指向'println'调用的'^',还是有另一个引用? – gravity

+0

'var println = print'的目标是什么。为什么不使用'typealias'? – JAL

+0

@JAL'typealias'只适用于类型,而不是函数;) – Hamish

回答

1

这里是print函数的定义:

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

当你得到它的引用,你丢弃的命名参数,如造成所有的投入都被视为因为Any...items的元素是不预定义数量的参数。在这样的定义下,没有办法提供separatorterminator

她是函数类型,因为它们是由斯威夫特看到:

printenter image description here printlnenter image description here

+1

因此,这会产生一个漏洞,当你参考一个这样的函数来参考vardiac params时,你将永远无法称之为成功?我注意到,当你引用func时,它总是会丢弃标签? – texasbruce

+0

对。我用图像更新了一个答案,以显示作为代码转换结果的'print'和'println'的实际函数签名。我想你需要为它创建一个雷达。我假设这样一个任务应该继承原始函数的所有属性。 –

+0

@texasbruce我想我的答案是你的问题的答案? ;) –

0

要不是有你需要做的是这样一些非常具体的原因,这应该实现尽管处于更迂回的方式:

func println (_ items: Any..., separator: String = " ", terminator: String = "\n") { 
    for item in items { 
     print(item, separator: separator, terminator: "") 
    } 
    print(terminator, separator: "", terminator: "") 
} 
println("test") 
println("test",".","\n")