Swift中函数重载参数的优先级
我有以下人为的例子:Swift中函数重载参数的优先级,swift,Swift,我有以下人为的例子: protocolfooable{} 扩展名Int:Fooable{} 扩展名为Double:Fooable{} 扩展Bool:Fooable{} func go(值:Any,类型:Fooable.type)->String{ 返回“可食” } func go(值:Any,类型:Int.type)->String{ 返回“Int” } func go(值:Any,类型:Double.type)->String{ 返回“双” } 设value1=1 go(value:value
protocolfooable{}
扩展名Int:Fooable{}
扩展名为Double:Fooable{}
扩展Bool:Fooable{}
func go(值:Any,类型:Fooable.type)->String{
返回“可食”
}
func go(值:Any,类型:Int.type)->String{
返回“Int”
}
func go(值:Any,类型:Double.type)->String{
返回“双”
}
设value1=1
go(value:value1,type:type(of:value1))//返回“Int”
设value2=2.0
go(value:value2,type:type(of:value2))//返回“Double”
设value3=true
go(value:value3,type:type(of:value3))//返回“可食”
这是我最终想要的行为,但是什么决定了这一优先顺序?更通用的第一个函数可以放在代码中的任何位置,给出相同的结果,因此必须有某种优先规则
这在任何地方都有概述吗?这里的关键词是“特定”。斯威夫特总是找到最具体的重载来调用
Swift首先推断value1
属于Int
类型,因此type(of:value1)
属于Int.type
现在我们有了一个Int.Type
作为参数,Swift寻找一个重载,该重载接受一个类型恰好为Int.Type
的参数。它找到一个并调用它。不调用接受Fooable.Type
的函数,因为它已经可以调用一个更具体的函数,该函数完全接受Int.Type
。在这里,“specific”意味着降低类型层次结构Int
被认为比Fooable
更具体,因为Int
符合Fooable
value3
被推断为类型Bool.type
。没有接受Bool.Type
的重载,因此Swift必须查找类型层次结构并找到接受Fooable.Type
的类型。这是您可以将Bool.type
传递到的最具体的类型。您的问题是什么?Swift推断类型和方法签名并调用相应的方法。为什么第二个参数用于这些函数中的任何一个?你能不能只使用func-go(value:Fooable)
,func-go(value:Int)
,func-go(value:Double)
?确切的问题解释起来有点复杂。我正在使用Encodable
/Decodable
协议,但我包装的是一些非常模糊的类型,实际上可以根据底层存储类型和结果变量修改值。以上是jsonecoder
如何处理这些约束的基本原理:是的,它似乎只是先处理最具体的类型,然后从那里开始下降。我只是不确定是否有更正式的东西。例如,我添加了一个Barable
协议,并将其应用于justBool
,然后为Barable
创建了一个go
函数,此时,编译器认为它太模糊了。