如果功能相似,Swift如何决定执行哪个功能?

时间:2018-07-02 17:44:44

标签: swift

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

有图案吗?

因为我遇到了两个比这更复杂的功能。无论我对它们执行什么命令,它都会首先执行“任何”操作(因为我假设它是从内存地址执行的,但似乎没有)。

有人说,由于结构或类的范围更广,它将执行“ Any”(在我的其他情况下)。但是下面的例子却相反。

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

import UIKit

func add(_ x: Int,_ y: Any) -> Int {
    return 3
}

func add(_ a: Int,_ b: Int) -> Int {
    return 1
}

print(add(2, 3))
// "1\n"

print(add(2, "3"))
// "3\n"

这是我的另一种情况:

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选择了最具体的一项,是否应该执行“浮动”一项?

2 个答案:

答案 0 :(得分:4)

看起来好像很具体。

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

答案 1 :(得分:2)

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

当您使用两个add参数调用Int时,它会发现有一个带有两个add参数的Int函数,因此会调用该参数。

当您使用addInt调用String时,它首先会寻找这样的功能,但是没有一个。然后,可以看到其中有一个IntAny。由于Any可以匹配任何类型,因此可以匹配。这样就叫。

不仅如此,但对于您的问题来说,这已经足够概括了。