struct CompoundedRequest<each Request: Message.Request> { let requests: (repeat each Request) init(requests: repeat each Request) { self.requests = (repeat each requests) } func encoded() -> Data { var count = 0 for _ in repeat each requests { count += 1 } var packet = Data() var index = 0 for request in repeat each requests { let data = request.encoded() let alignment = Data(count: 8 - data.count % 8) if index < count - 1 { let body = data + alignment var header = Header(data: body[..<64]) let payload = data[64...] header.nextCommand = UInt32(body.count) packet += sign(header.encoded() + payload + alignment) } else { packet += sign(data + alignment) } index += 1 } return packet } } private func send<each Request: Message.Request>(_ request: CompoundedRequest<repeat each Request>) async throws -> (repeat (each Request).Response) { let packet = request.encoded() let responseData = try await connection.send(packet) let reader = ByteReader(responseData) var responses = [Data]() var header: Header var offset = 0 repeat { responses.append(Data(responseData[offset...])) header = reader.read() offset += Int(header.nextCommand) reader.seek(to: offset) } while header.nextCommand != 0 var iterator = 0 func respond<R: Message.Request>(requestType: R.Type) -> R.Response { let response = R.Response(data: responses[iterator]) iterator += 1 return response } return (repeat respond(requestType: (each Request).self)) }
for message in repeat each messages {
のところ、struct CompoundedRequest<each Request: Message.Request>
っていうのと作るっていうのはどうだろうか。 (edited)let compoundedRequest = CompoundedRequest(requests: createRequest, setInfoRequest, closeRequest) let (r1, r2, r3) = try await send(compoundedRequest)
こう使う。。。まあ好みだな。struct CompoundedRequest<each Request: Message.Request> { let requests: (repeat each Request) init(requests: repeat each Request) { self.requests = (repeat each requests) }
この部分の型アノテーションや変数の代入、 func send<each Request: Message.Request>(_ messages: repeat each Request) async throws -> (repeat (each Request).Response)
ここの戻り値、のところは外側のカッコがないとダメっていうの難しい。