首页 > 解决方案 > 为什么 IndexSet 可以用负数初始化?

问题描述

关于的文档IndexSet

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

但是这段代码工作正常:

let indexSet = IndexSet(integer: -1)

如果我们尝试使用-2,它将按预期产生崩溃。

为什么会这样?这是一个错误还是我错过了什么?

在 Xcode 9.4.1、Swift 4.1 上测试。

标签: swift

解决方案


这是一个错误。它来自一个事实,即 an 的初始化程序IndexSet是不可失败的。是标准库中定义的初始化程序:

/// 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 时,它会给您一个正确的错误消息:

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

推荐阅读