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

标签 swift type-inference

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

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

猜测:Swift 的编译器总是通过更窄/受限的值类型来推断类型,因为 Int8Int 相比,它是一种更小更窄的类型,因此添加一个 Int8和一个 Int数字会导致 Int8类型推断。

问题:我说得对吗?或大部分正确但不准确。如果是这样,请纠正我。

谢谢

最佳答案

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

类型推理引擎的选择基于所选的 + 版本。基于 Int 的 + 函数均不适用。它们都是以下形式:

public func +(lhs: Int8, rhs: Int8) -> Int8

而且它的两边都没有 Int8。因此它会选择它能找到的下一个最具体的:

public func +<T : Strideable>(lhs: T, rhs: T.Stride) -> T

为什么是这个? Int8 是一个 SignedIntegerSignedInteger 以这种方式实现 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
}

通过类型推断,我们看到 StrideInt。所以我们的功能是:

public func +(lhs: Int8, rhs: Int) -> Int8

这当然会在运行时溢出。

顺便说一句,找出 Swift 选择的函数的最佳方法是按住 Option 键并单击 + 符号。它会告诉您它使用的是什么类型。

关于swift - 对类型推断背后机制的猜测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38805320/

相关文章:

sockets - 如何快速连接到套接字以读取数据并写入数据

Haskell:鼓励 GHC 推断正确的中间类型

scala - 为什么 Scala 无法对 f 绑定(bind)多态性进行类型推断?

c++ - 如何使用 lambda 在 std::function 参数中推导模板类型?

typescript - 如何从 typescript 中的参数推断或推导返回类型

haskell - 如何轻松应对Haskell上的类型系统?

swift - UIImage Aspect Fill 和 clipsToBounds

ios - NSRegularExpression,匹配字符串,高亮文本。大约 85% 的时间工作。为什么?

ios - 错误域 = PlugInKit 代码 = 13 "query cancelled"UserInfo = {NSLocalizedDescription = 查询已取消}

swift - 如何在 Swift 中构建递归函数以返回字符串?