Avatar
Avatar
Kishikawa Katsumi
public struct Header { public let protocolId: UInt32 public let structureSize: UInt16 public internal(set) var creditCharge: UInt16 public let status: UInt32 ... public init( creditCharge: UInt16 = 1, command: Command, creditRequest: UInt16 = 0, flags: Flags = [], nextCommand: UInt32 = 0, messageId: UInt64, treeId: UInt32 = 0, sessionId: UInt64 ) { self.protocolId = 0x424D53FE self.structureSize = 64 self.creditCharge = creditCharge self.status = 0 self.command = command.rawValue ... } init(data: Data) { let reader = ByteReader(data) protocolId = reader.read() structureSize = reader.read() creditCharge = reader.read() status = reader.read() ... } 最初の例は簡単に書いたのでプロパティの定義と初期化を一緒にしましたが、実際はこのようにinitで定数になっているので、受信のときは受け取ったバイナリから初期化されます。その場合でもprotocolIdやstructureSizeを利用者が個別に変更したいというユースケースはないはずです。 (edited)
ああなるほど。送信用はvalidな値しかできなくて、受信時は流せるから、あくまで組み立てた後に変更ができない話でしたね。 あるとすれば、あるピアから受け取ったパケットをあえて一部壊して他のピアに転送する、みたいなイカれたノードを実装してみたいみたいな時に、不便がありそうですが、そんな事しなそうですね。 ただこういった「そんな事しなそう」を超えるアイデアが将来出てくるものなのが難しい
struct DebugHeaderとかstruct BrokenHeaderを作ってやります
これは良いですね。確かにだいぶセマンティクスからはみ出てるので別物として区別するのはどちらの立場からも嬉しい解決方法。
(edited)