2016-09-16 25 views
1

正直言って、swift3(obj-cから)への移植は難しいです。最も簡単ではあるが迅速な質問。swiftでのビット演算と算術演算

public func readByte() -> UInt8 
{ 
    // ... 
} 

public func readShortInteger() -> Int16 
{ 
    return (self.readByte() << 8) + self.readByte(); 
} 

コンパイラからエラーメッセージが表示されます。「バイナリ演算子+は2つのUInt8オペランドに適用できません。

どうしたのですか?

ps。どのような恥;)

答えて

4

readByteのでUInt8を返します。

  1. あなたはそのすべてのビットを失うことになる、8ビット左UInt8をシフトすることはできません。
  2. 式のタイプは、UInt8です。これは計算中のInt16の値に適合しません。
  3. 式の型はUInt8であり、注釈付き戻り型Int16ではありません。

D

func readShortInteger() -> Int16 
{ 
    let highByte = self.readByte() 
    let lowByte = self.readByte() 

    return Int16(highByte) << 8 | Int16(lowByte) 
} 

スウィフトは、オペランドの厳密に左右評価順序を持っているが、私が最初に読み込まれ、これが第二読み込まれるバイト、それを明示的にするためにコードをリファクタリング。

また、OR演算子は、自己文書化と意味論でもあります。

+0

あなたは、ここに 'var'は必要ありません。 :)また、タイプ推論を別々に行うのではなく、単にタイプ推論に 'let highByte = self.readByte()'を使って作業させるのはもっと慣用的です。 –

+0

@TimVermeulenああ!改善していただきありがとうございます! –

+0

int8に署名する必要があります。実際のコード(CocoaAMF): ​​' - (int16_t)decodeShort { \t [self _ensureLength:2]; \t int8_t ch1 = m_bytes [m_position ++]; \t int8_t ch2 = m_bytes [m_position ++]; \t return(ch1 << 8)+ ch2; } ' – danilabagroff

0

Appleはここで、この上でいくつかの素晴らしいスウィフトのドキュメントを持っている:あなたは任意の変異をやっていないので、

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html

let shiftBits: UInt8 = 4 // 00000100 in binary 
shiftBits << 1    // 00001000 
shiftBits << 2    // 00010000 
shiftBits << 5    // 10000000 
shiftBits << 6    // 00000000 
shiftBits >> 2    // 00000001