swift - 为什么 IndexSet 可以用负数初始化?
问题描述
关于的文档说IndexSet
:
有效整数值的范围是
0..<INT_MAX-1
。超出此范围的任何内容都是错误的。
但是这段代码工作正常:
let indexSet = IndexSet(integer: -1)
如果我们尝试使用-2
,它将按预期产生崩溃。
为什么会这样?这是一个错误还是我错过了什么?
在 Xcode 9.4.1、Swift 4.1 上测试。
解决方案
这是一个错误。它来自一个事实,即 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'
推荐阅读
- c++ - 是否可以在 C++ 中捕获未连接线程终止的异常?
- android - QEMU android aarch64 作为主机。来宾 32 位 x86 或 x86_64 哪个会更快?
- javascript - 多个连续 5 分钟倒计时
- codenameone - 如何通过点击推送通知消息获得特定操作?
- azure - Azure Powershell 脚本强制 FTPS Set-AzWebApp:无法将“System.Object[]”转换为参数所需的“System.String”类型
- terraform - Terraform 状态管理(在 GCP 中部署)
- go - 如何启动子进程,即在我的主进程退出时退出
- groovy - 使用 groovy 创建的 xlsx 文件无法打开,因为格式或扩展名无效
- javascript - 通过 WebRTC 数据通道实现 WebService 是否可行且合理?
- java - 如果指定的文件不存在,RandomAccessFile 是否会创建一个新文件?如果文件确实存在,它会用新文件替换文件吗?