我寫了這個代碼在操場測試(學習)用途:使用和不使用默認參數聲明的調用函數導致不同的結果?
import Cocoa
func DoIt(a: Int, b: Int, c :Int = 0) -> Int {
return a + b + c;
}
func DoIt(a: Int, b: Int, c :NSObject) -> Int {
return a * b * c.description.lengthOfBytesUsingEncoding(NSUTF8StringEncoding);
}
當我使用它,我得到這個:
DoIt(4, 5, 6); // result: 20
var obj = NSObject(); // result: NSObject
DoIt(4, 5, obj); // result: 520
我做DoIt(4, 5, 6);
時所預期的第一個函數DoIt(Int, Int, Int)
調用,但顯然另一個被稱爲。 6
去哪了?它看起來像6
被隱式轉換爲NSObject
,在Objective-c中至少會引發警告。
這是爲什麼?
奇怪的是,如果我要求最後c: Int
(通過刪除= 0
)然後它按預期工作。
DoIt(4, 5, 6); // result: 15
var obj = NSObject(); // result: NSObject
DoIt(4, 5, obj); // result: 520
EDIT1:增加IR
如果這有助於瞭解對我發出以下命令,結果是要點鏈接是怎麼回事:https://gist.github.com/nacho4d/94fdb72d8a3fee0c09e5
$ swiftc \
-emit-ir /Users/nacho4d/Desktop/function2/function2/main.swift \
-sdk Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk
有在reddit上的一個線程,也許它有幫助:[爲什麼Swift編譯器隱式地將整數和其他原語轉換爲NSNumber](http://www.reddit.com/r/swift/comments/2em7ic/why_swift_compiler_convert_implicitly_integers/) –
我不知道爲什麼它工作這w唉,但我不相信這是有意的行爲。如果是的話,我覺得很奇怪。 – Dair
謝謝@SebastianDressler我剛剛讀了那個帖子。我理解隱式裝箱(原始到NSNumber)及其相反的拆箱。但我不確定這是否是這種情況。這仍然不清楚我 – nacho4d