gpt4 book ai didi

swift - Swift 中函数重载参数的优先级

转载 作者:行者123 更新时间:2023-11-28 14:02:46 25 4
gpt4 key购买 nike

我有以下人为的例子:

protocol Fooable { }

extension Int: Fooable { }
extension Double: Fooable { }
extension Bool: Fooable { }

func go(value: Any, type: Fooable.Type) -> String {
return "Fooable"
}

func go(value: Any, type: Int.Type) -> String {
return "Int"
}

func go(value: Any, type: Double.Type) -> String {
return "Double"
}

let value1 = 1
go(value: value1, type: type(of: value1)) // Returns "Int"

let value2 = 2.0
go(value: value2, type: type(of: value2)) // Returns "Double"

let value3 = true
go(value: value3, type: type(of: value3)) // Returns "Fooable"

这是我最终想要的行为,但是什么设置了这个优先级?更通用的 first 函数可以放在代码中的任何位置,给出相同的结果,因此必须有某种优先级规则。

这是在任何地方概述的吗?

最佳答案

这里的关键词是“具体”。 Swift 总能找到最具体的重载来调用。

Swift 首先推断value1Int 类型,所以type(of: value1)Int.Type

现在我们有一个 Int.Type 作为参数,Swift 寻找一个重载,它接受一个类型正好是 Int.Type 的参数。它找到一个并调用它。接受 Fooable.Type 的那个不会被调用,因为它已经可以调用一个更具体的接受 Int.Type 的。在这里,“特定”意味着降低类型层次结构。 Int 被认为比 Fooable 更具体,因为 Int 符合 Fooable

value3 被推断为 Bool.Type 类型。没有接受 Bool.Type 的重载,因此 Swift 必须查找类型层次结构并找到接受 Fooable.Type 的类型。这是您可以将 Bool.Type 传递到的最具体的类型。

关于swift - Swift 中函数重载参数的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53376548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com