如何在iOS Swift中添加两个UInt8变量?

时间:2016-05-25 13:07:59

标签: ios swift2 swift-playground

假设有两个变量:

let number1 : UInt8 = 100;
let number2 : UInt8 = 100;

您可以添加并打印它们

print(number1 + number2)  //This prints 200

现在再定义一次

let number3 : UInt8 = 200;

并尝试立即添加

print(number1 + number3)  // Throws execution was interrupted

据我所知,number1和number3的总和超出了UInt8的范围,但显式转换也无济于事,例如以下行也会出现同样的错误:

print(UInt8(number1 + number3)) // Throws execution was interrupted

我找到的方法是做以下事情:

print(Int(number1) + Int(number3))

当它们的总和超出范围时,是否有更好的方法来添加UInt8数字?

2 个答案:

答案 0 :(得分:4)

Girish K Gupta,

UInt8的最大范围为0到255.您可以使用UInt8.minUInt8.max进行检查。基本上是0到2的功率8。

print(number1 + number3)的问题将返回300. 300大于255因此崩溃。

当您添加两个UInt8时,默认情况下会将结果转换为UInt8,因此崩溃

最后当你Int(number1) + Int(number3)强行将number1和number3强制转换为Int时。

使用Int时,其值的范围取决于运行它的平台32位或64位。例如,对于32位,其范围可以是-2,147,483,648到2,147,483,647。

当您将Int添加到Int时,结果将被强制转换为Int。并且相信我300在范围内:)

根据您的问题,有更好的方法:)

Apple的文档清楚地指定并指示使用Int而不是UInt8或UInt32甚至UInt64,除非使用UInt8,UInt32或UInt64绝对必要。

以下是苹果公司文档的引用:)

  

“仅当您特别需要无符号整数类型时才使用UInt   与平台的原生单词大小相同。如果不是这样的话   在这种情况下,Int是首选,即使要存储的值是   已知是非负面的。 Int对整数值的一致使用   帮助代码互操作,避免了在之间进行转换的需要   不同的数字类型,并匹配整数类型推断,“

     

摘自:Apple Inc.“Swift编程语言(Swift 2.2)。”   iBooks的。 https://itun.es/in/jEUH0.l

对你来说最好的事情:)跟着苹果指令:)将number1,number2和number3改为Int :)问题解决了:))

因此没有崩溃:)

答案 1 :(得分:2)

正如您所说,将两个UInt8变量转换为Int会覆盖溢出时的默认异常,因为生成的Int现在有足够的空间来适应总和。

为了避免为每个操作转换变量,我们希望像这样重载运算符:

Providers

然而,这会给我们一个编译器错误,因为已经为添加两个UInt8定义了+运算符。

我们可以做的是define a custom operator,比如^ +意味着添加两个UInt8,但是像Int那样添加它们:

func + (left: UInt8, right: UInt8) -> Int {
   return Int(left) + Int(right)
}

然后我们可以在我们的算法中使用它:

infix operator ^+ { associativity left precedence 140 }

func ^+ (left: UInt8, right: UInt8) -> Int {
    return Int(left) + Int(right)
}

如果您希望结果只是溢出,可以使用the overflow operators from the standard library

print(number1 ^+ number3) // Prints 300