【Swift5】DataをIntやDoubleなどと相互変換する方法

Swift5でData型をInt型やDouble型などと相互変換する方法を紹介します。Core Bluetoothを使ってBLE通信をする際は、バイナリデータを使うことになるので、この方法を覚えておくと便利です。

Dataを〇〇に変換

UInt32に変換する場合

data.withUnsafeBytes { $0.load( as: UInt32.self ) }

Doubleに変換する場合

data.withUnsafeBytes { $0.load( as: Double.self ) }

このようにas:に型タイプを指定することで、Dataから各型に変換することができます。

〇〇からDataに変換

Dataに変換する時は、下記のコードでいけます。

data = Data(bytes: &value, count: MemoryLayout.size(ofValue: value))

BLEなどでバイナリデータを操作する場合

BLEでデータをやりとりする場合はバイナリデータ(Data型)で送受信します。そういった時は送受信するメッセージをクラスとしてまとめておくと操作が簡単になります。

例えば、id(UInt16)とvalue(Float)をセットで送受信する場合を想定して、idとvalueを持ったMessageクラスを用意しました。(わかりやすさ重視で異常系は省いています)

class Message {
    
    var id: UInt16 = 0
        
    var value: Float = 0.0
    
    init (id: UInt16, value: Float) {
        self.id = id
        self.value = value
    }
    
    init(data: Data) {
        id = Data(data[0...1]).withUnsafeBytes { $0.load( as: UInt16.self ) }
        value = Data(data[2...5]).withUnsafeBytes { $0.load( as: Float.self ) }
    }
    
    func toData() -> Data {
        var data = Data(bytes: &id, count: MemoryLayout.size(ofValue: id))
        data.append(Data(bytes: &value, count: MemoryLayout.size(ofValue: value)))
        return data
    }
}

これを使うとBLEの送信時には次のように書けます。

let sendMessage = Message(id: 1, value: 1.5)
peripheral.writeValue(sendMessage.toData(), for: characteristis!, type: .withResponse)

受信時は次のように書けます。

let receivedMessage = Message(data: requests.first?.value)
print("id= \(receivedMessage.id)")
print("value= \(receivedMessage.value)")

以上です、お疲れ様でした!