大佬教程收集整理的这篇文章主要介绍了使用和不使用默认参数声明的swift调用函数会导致不同的结果?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
import Cocoa func DoIt(a: Int,b: Int,c :Int = 0) -> Int { return a + b + c; } func DoIt(a: Int,c :NSObject) -> Int { return a * b * c.description.lengthOfBytesUsingEncoding(NSUTF8StringEncoding); }
当我使用它时,我得到了这个:
DoIt(4,5,6); // result: 20 var obj = NSObject(); // result: NSObject DoIt(4,obj); // result: 520
我期待在执行DoIt时调用的第一个函数DoIt(Int,Int,int)(4,6);但显然另一个被称为. 6去了哪里?看起来6被隐式转换为NSObject,在objective-c中至少会引发警告.
为什么是这样?
奇怪的是,如果我需要最后一个c:Int(通过删除= 0),那么它按预期工作.
DoIt(4,6); // result: 15 var obj = NSObject(); // result: NSObject DoIt(4,obj); // result: 520
编辑1:添加了IR
如果这有助于理解发生了什么,我发出了以下命令,结果在gist链接中: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
func DoIt(a: Int,c : Int = 0) -> Int
被编译器视为
func DoIt(a: Int,c c : Int = 0) -> Int
DoIt(4,c: 6) // result: 15
但是电话
DoIt(4,6)
func DoIt(a: Int,c :NSObject) -> Int
(第三个参数自动桥接到NSnumber,它是一个子类
NSObject).这就是你得到“意外”输出的原因.
func DoIt(a: Int,_ c : Int = 0) -> Int
DoIt(4,6) // result: 15
以上是大佬教程为你收集整理的使用和不使用默认参数声明的swift调用函数会导致不同的结果?全部内容,希望文章能够帮你解决使用和不使用默认参数声明的swift调用函数会导致不同的结果?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。