Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用和不使用默认参数声明的swift调用函数会导致不同的结果?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我在操场上编写了用于测试(学习)目的的代码: 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.lengthOfByte
我在操场上编写了用于测试(学习)目的的代码
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
从Swift文档中的 “Functions”开始(强调添加):

所以你的一个函数声明

func DoIt(a: Int,c : Int = 0) -> Int

被编译器视为

func DoIt(a: Int,c c : Int = 0) -> Int

使用外部参数名称“c”表示第三个参数.这个功能
必须被称为

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,请注明来意。