2017-06-02 58 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")