就像下面的两个函数一样,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
函数,因此它调用该函数。
当你用Int
和String
调用add
时,它首先寻找这样的函数,但没有。然后它看到有一个Int
和Any
.由于Any
可以匹配任何类型,因此它匹配。所以那个被称为。
还有更多的东西,但对于你的问题来说,这是一个足够好的概括。