Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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_Type Inference - Fatal编程技术网

Swift 对类型推断背后机制的猜测

Swift 对类型推断背后机制的猜测,swift,type-inference,Swift,Type Inference,我在xCode中尝试过这段代码:让bigNum=Int8.max+Int(“1”)编译器推断出Int8类型的变量bigNum,并给我一个溢出错误 对于Int8.max+Int(“1”):左侧的“+”类型为Int8,右侧的类型为Int。为什么编译器没有将bigNum推断为Int的类型 Guess:Swift的编译器总是通过更窄/受限的值类型来推断tye,因为与Int相比,Int8是一个更小更窄的类型,因此添加Int8和Int数字将导致Int8类型推断 问题:我说得对吗?或者基本正确,但不精确。如果

我在xCode中尝试过这段代码:
让bigNum=Int8.max+Int(“1”)编译器推断出
Int8
类型的变量bigNum,并给我一个溢出错误

对于
Int8.max+Int(“1”):左侧的“+”类型为
Int8
,右侧的类型为
Int
。为什么编译器没有将bigNum推断为
Int
的类型

Guess:Swift的编译器总是通过更窄/受限的值类型来推断tye,因为与
Int
相比,
Int8
是一个更小更窄的类型,因此添加
Int8
Int
数字将导致
Int8
类型推断

问题:我说得对吗?或者基本正确,但不精确。如果是,请纠正我


谢谢

类型推断引擎不知道整数的位宽度。它甚至不知道整数是数字。引擎不知道类型如何实现的“限制性”或“狭窄性”。它只知道类型如何作为超类型和子类型相互关联(“ISA”关系),并试图通过找出可以插入到您提供的类型变量中的内容来解决约束问题

相反,类型推理引擎的选择基于所选的
+
版本。所有基于Int的
+
函数均不适用。它们都是这样的:

public func +(lhs: Int8, rhs: Int8) -> Int8
而且它的两边都没有
Int8
。因此,它选择了它能找到的下一个最具体的:

public func +<T : Strideable>(lhs: T, rhs: T.Stride) -> T
通过类型推断,我们可以看到
Stride
Int
。因此,我们的职能是:

public func +(lhs: Int8, rhs: Int) -> Int8
当然,这在运行时会溢出


顺便说一句,确定Swift选择了什么函数的最佳方法是单击选项
+
符号。它会告诉你它使用的是什么类型。

“顺便说一句,确定Swift选择了什么函数的最好方法是选择+符号。”非常感谢!
public func +(lhs: Int8, rhs: Int) -> Int8