首页 > 解决方案 > 为什么这个便利的 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初始化程序。但为什么?为什么在这种情况下没有歧义?

标签: swift

解决方案


不带参数的函数被认为比带默认值参数的函数更好。相比:

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") }
     ^

推荐阅读