Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中函数重载参数的优先级_Swift - Fatal编程技术网

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
协议,并将其应用于just
Bool
,然后为
Barable
创建了一个
go
函数,此时,编译器认为它太模糊了。