如果函数相似,Swift 如何决定执行哪个函数?



就像下面的两个函数一样,Swift 会先执行哪个函数?

有没有模式?

因为我遇到了两个比这更复杂的函数。它首先执行"任何",无论我对它们做出什么顺序(因为我假设它从内存地址执行,但似乎不是(。

有人说它将执行"任何"(在我的另一种情况下(,因为它的结构或类范围更广。但下面的例子说的恰恰相反。

想知道为什么以及如何发生这种情况,或者我在哪里可以得到答案。

import UIKit
func add(_ x: Int,_ y: Any) -> Int {
return 3
}
func add(_ a: Int,_ b: Int) -> Int {
return 1
}
print(add(2, 3))
// "1n"
print(add(2, "3"))
// "3n"

这是我的另一个案例:

let constraint = titleLabel.layout(.width, .lessThanOrEqual, 122)

这是我期望执行的:

func layout(_ attribute: NSLayoutAttribute, _ relatedBy: NSLayoutRelation, _ constant: CGFloat, active: Bool = true, priority: UILayoutPriority = .init(1000)) -> NSLayoutConstraint {}

但它实际上执行了这个:

func layout(_ attribute: NSLayoutAttribute, _ relatedBy: NSLayoutRelation, _ toItem: Any?, active: Bool = true, priority: UILayoutPriority = .init(1000)) -> NSLayoutConstraint {}

如果 Swift 选择了最具体的一个,它不应该执行"Float"吗?

看起来它尽可能具体。

它尽可能调用 add(int, int(,并在需要时回退到 add(int, any(。

Swift 编译器选择与您正在进行的调用匹配的函数签名。

当您使用两个Int参数调用add时,它会看到有一个具有两个Int参数的add函数,因此它调用该函数。

当你用IntString调用add时,它首先寻找这样的函数,但没有。然后它看到有一个IntAny.由于Any可以匹配任何类型,因此它匹配。所以那个被称为。

还有更多的东西,但对于你的问题来说,这是一个足够好的概括。

相关内容

最新更新