Swift 对类型推断背后机制的猜测
我在xCode中尝试过这段代码: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类型推断 问题:我说得对吗?或者基本正确,但不精确。如果
让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