【问题标题】:A guess for a mechanism behind Type Inference类型推断背后机制的猜测
【发布时间】:2016-08-06 14:26:40
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: swift type-inference


    【解决方案1】:

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

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

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

    而且这两边都没有Int8。所以它会选择下一个它可以找到的最具体的:

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

    为什么是这个? Int8SignedIntegerSignedInteger 以这种方式实现 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 选择了什么函数的最佳方法是 Option-单击 + 符号。" 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多