猜测类型推断背后的机制

时间:2016-08-06 14:26:40

标签: swift type-inference

我在xCode中试过这段代码:let bigNum = Int8.max + Int("1")!编译器推断类型为Int8的变量 bigNum 并给我一个溢出错误。

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

猜猜:Swift的编译器总是通过更窄/受限制的值类型推断tye,因为Int8是一个比{{1}更小和更窄的类型因此,添加IntInt8号码会导致Int类型推断。

问题:我是对的吗?或大多数是正确但不精确。如果是这样,请纠正我。

谢谢

1 个答案:

答案 0 :(得分:7)

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

类型推理引擎的选择基于所选的+版本。没有基于Int的public func +(lhs: Int8, rhs: Int8) -> Int8 函数适用。它们都是以下形式:

Int8

这两边都没有public func +<T : Strideable>(lhs: T, rhs: T.Stride) -> T 。所以它选择了它能找到的下一个最具体的一个:

Int8

为什么选择这个? SignedIntegerSignedIntegerStrideable以这种方式实现public protocol Strideable : Comparable { associatedtype Stride : SignedNumber public func distance(to other: Self) -> Self.Stride public func advanced(by n: Self.Stride) -> Self } extension SignedInteger { public func distance(to other: Self) -> Int public func advanced(by n: Int) -> Self }

Stride

通过类型推断,我们发现Intpublic func +(lhs: Int8, rhs: Int) -> Int8 。所以我们的功能是:

+

当然,这会在运行时溢出。

顺便说一句,了解Swift选择的功能的最佳方法是选择 - 单击 var loadLastdata = function(req, res) { arrayDefine = new Array(); History.find( {rid:req.params.rid} , function(err, historyres) { if(historyres) { for (var key in historyres) { console.log('########### In Loop ###############'); console.log(historyres[key].data); arrayDefine.push(historyres[key].data); console.log('########### In Loop ###############'); } } console.log('########### Array Value ###############'); console.log(arrayDefine); console.log('########### Array Value ###############'); } }).limit(1).sort({$natural:-1}); } 符号。它会告诉你它正在使用什么类型。