swift - 为什么这个便利的 init 不会在 Swift 中引入歧义?
问题描述
@objc public convenience init(size: CGSize, name: String? = nil, address: Address? = nil, order: [Item] = [], phone: String? = nil) {
self.init(size: size, name: name, address: address, order: order)
self.phone = phone
}
@objc public required init(size: CGSize, name: String? = nil, address: Address? = nil, order: [Item] = []) {}
便利初始化程序在上面的代码中调用所需的初始化程序。在我的测试中,我尝试打电话
let object = ClassA(size: .zero)
我希望看到编译器抱怨歧义,因为两个初始化程序都可以以这种方式调用。但是,它实际上会编译并调用required
初始化程序。但为什么?为什么在这种情况下没有歧义?
解决方案
不带参数的函数被认为比带默认值参数的函数更好。相比:
func f(_ arg: String = "") { print("unary") }
func f() { print("nullary") }
f()
输出:
nullary
如果两个函数都有带默认值的参数,那就不明确了:
func f(_ arg: String = "") { print("string") }
func f(_ arg: Int = 1) { print("int") }
f()
输出:
error: Untitled Page 2.xcplaygroundpage:4:1: error: ambiguous use of 'f'
f()
^
Untitled Page 2.xcplaygroundpage:2:6: note: found this candidate
func f(_ arg: String = "") { print("string") }
^
Untitled Page 2.xcplaygroundpage:3:6: note: found this candidate
func f(_ arg: Int = 1) { print("int") }
^
推荐阅读
- javascript - 是否可以破解 javascript 界面?
- raspberry-pi - libcurl4-openssl-dev :冲突:libssl1.0-dev 但要安装 1.0.2q-2
- c# - 在我的 Web api 端点中解析 HTTP POST 请求正文时出错
- python - passing optional arguments to a function in pandas
- scala - 初始化后更改 Future 的 ExecutionContext
- c++ - 调用 Mitsuba 附加组件的构造函数时,未定义的符号运行时错误是什么意思?
- jekyll - 将变量传递到 for 循环中 - 不起作用
- jquery - Jquery 仅显示所选选项之一 + 必需
- python - 如何在 pandas 中使用 API Endpoint 下载 .csv 文件
- android - 如何只通知一次不同片段中的 liveData 更改?