类型推断引擎不知道 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 选择了什么函数的最佳方法是按住 Option 键并单击 + 符号。它会告诉你它正在使用什么类型。