老实说,移植到swift3(来自obj-c)是很困难的。最简单但最快捷的问题。
public func readByte() -> UInt8
{
// ...
}
public func readShortInteger() -> Int16
{
return (self.readByte() << 8) + self.readByte();
}从编译器获得错误消息:“二进制运算符+不能应用于两个UInt8操作数。”
怎么啦?
ps。(真可惜;)
发布于 2016-09-16 17:23:32
readByte返回一个UInt8,因此:
UInt8,你就会失去它的所有比特。UInt8,它不能满足它正在计算的Int16值。UInt8,它不是带注释的返回类型Int16。D
func readShortInteger() -> Int16
{
let highByte = self.readByte()
let lowByte = self.readByte()
return Int16(highByte) << 8 | Int16(lowByte)
}虽然Swift对操作数有严格的左-右求值顺序,但我重构了代码,使其明确显示先读取哪个字节,读取哪个字节。
此外,OR运算符更具有自文档化和语义性。
发布于 2017-08-09 15:26:24
苹果在这方面有一些很棒的Swift文档,如下所示:
Language/AdvancedOperators.html
let shiftBits: UInt8 = 4 // 00000100 in binary
shiftBits << 1 // 00001000
shiftBits << 2 // 00010000
shiftBits << 5 // 10000000
shiftBits << 6 // 00000000
shiftBits >> 2 // 00000001https://stackoverflow.com/questions/39536734
复制相似问题