gpt4 book ai didi

带有 switch 语句的 Swift 范围错误

转载 作者:搜寻专家 更新时间:2023-11-01 05:59:07 25 4
gpt4 key购买 nike

大家好,我是新来的,现在我正在通过编写一些奇特的算法来学习 Swift,这是我在阅读 Apple 的 Swift 书籍时想到的。

我试图压缩(自动向下转换)任何 IntegerType 值。这是我的代码的一小段,除了一种情况外几乎可以正常工作:

switch signedValue
{
case Int64(Int8.min)...Int64(Int8.max): compressedValue = Int8(signedValue)
case (Int64(Int8.max) + 1)...Int64(UInt8.max): compressedValue = UInt8(signedValue)
case Int64(Int16.min)...Int64(Int16.max): compressedValue = Int16(signedValue)
case (Int64(Int16.max) + 1)...Int64(UInt16.max): compressedValue = UInt16(signedValue)
case Int64(Int32.min)...Int64(Int32.max): compressedValue = Int32(signedValue)
case (Int64(Int32.max) + 1)...Int64(UInt32.max): compressedValue = UInt32(signedValue)
case Int64(Int.min)...Int64(Int.max): compressedValue = Int(signedValue) // range bug #1 - workaround '..<'
default: compressedValue = signedValue
}

假设 signedValue 是 Int64 类型,输入值 = 10_000_000_000。这将导致运行时错误(在 Playground 中):

Execution was interrupted, reason: EXC_BAD_INSTRUCTION ...

任何人都可以帮助我了解这里到底发生了什么。此问题有一个解决方法。我可以使用 '..<' 而不是 '...' 但这不是范围应该的样子。

最佳答案

与区间(有两种风格,半开或闭)不同,Range永远只是半开的。所以当你写 1...5 , ...函数递增右侧参数以创建半开范围 1..<6 .

这样做的结果是你不能有一个跨越整个整数类型长度的范围,因为 1...Int.max将导致尝试增加 Int.max , 和溢出错误。 let s = "hello"; let r = s.startIndex...s.endIndex 会出现类似的错误

然而,一切并没有丢失,因为无论如何你都不应该使用范围,这是 ClosedInterval 的工作.自 ...运算符用于两者,并且默认为范围(出于重载优先级原因)您需要明确标识类型:

let i64interval: ClosedInterval = Int64(Int64.min)...Int64(Int64.max)
switch signedValue {
// etc
case i64interval: compressedValue = Int(signedValue)
default: compressedValue = signedValue
}

关于带有 switch 语句的 Swift 范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28546203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com