我在xCode中试过这段代码:let bigNum = Int8.max + Int("1")!
编译器推断类型为Int8
的变量 bigNum 并给我一个溢出错误。
对于Int8.max + Int("1")!
:" +" 的左侧类型为Int8
,右侧的类型为Int
}。为什么编译器没有将 bigNum 推断为Int
的类型?
猜猜:Swift的编译器总是通过更窄/受限制的值类型推断tye,因为Int8
是一个比{{1}更小和更窄的类型因此,添加Int
和Int8
号码会导致Int
类型推断。
问题:我是对的吗?或大多数是正确但不精确。如果是这样,请纠正我。
谢谢
答案 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
为什么选择这个? SignedInteger
是SignedInteger
。 Strideable
以这种方式实现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
通过类型推断,我们发现Int
是public 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});
}
符号。它会告诉你它正在使用什么类型。