代码之家  ›  专栏  ›  技术社区  ›  pacification

为什么索引集可以用负数初始化?

  •  0
  • pacification  · 技术社区  · 6 年前

    这个 documentation 关于 IndexSet

    有效整数值的范围为 0..<INT_MAX-1 . 任何超出此范围的都是错误。

    但是这个代码很好用:

    let indexSet = IndexSet(integer: -1)
    

    如果我们试着 -2 ,它将产生预期的崩溃。

    为什么会这样?是虫子还是我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   ielyamani    6 年前

    这是个虫子。它来自于一个 IndexSet Here 是标准库中定义的初始值设定项:

    /// Initialize an `IndexSet` with a single integer.
    public init(integer: Element) {
        _handle = _MutablePairHandle(NSIndexSet(index: integer), copying: false)
    }
    

    有效整数值的范围为 0..<INT_MAX-1 . 外面有什么吗 此范围是错误的。

    extension IndexSet {
        public init(unsignedInt: UInt) {
            self = IndexSet(integer: Int(unsignedInt))
        }
    }
    

    因此,当您尝试用负整数初始化索引集时,它将给出正确的错误消息:

    IndexSet(unsignedInt: -1) //Negative integer '-1' overflows when stored into unsigned type 'UInt'