##前提・実現したいこと
didReceiveReadで受け取ったCBATTRequestを、別の関数で識別・request.valueの書き換えを行い、呼び出し元の関数でrespondするプログラムを作成しました。
Swiftは基本的にinoutをつけない限り値渡しである認識しています。
つまり、別の関数でrequest.valueを書き換えたとしても、呼び出し元のdidReceiveReadへは反映されないと考えていました。
しかし、下記コードは正常に動作し、Centralで受け取ったデータは正しく変更されています。
なぜこのコードで正常動作するのかがわかりません。
また試しに呼び出し先の引数requestへinoutをつけましたが、
didReceiveReadの引数requestはletの変数なのでinoutはつけられないとエラーが出ました。
どなたか何故このような挙動ができるのかお分かりになる方がいらっしゃいましたら
教えていただけると幸いです。
##該当のソースコード
Swift
1static var counter: UInt16 = 0 2 3...... 4 5let prop1: CBCharacteristicProperties = [.read] 6let perm1: CBAttributePermissions = [.readable] 7let prop2: CBCharacteristicProperties = [.read,.write] 8let perm2: CBAttributePermissions = [.readable] 9 10/// skipCharacteristicのvalueを作成 11var Number: UInt16 = 12345 12var byteArray = [UInt8]() 13byteArray.append(contentsOf: withUnsafeBytes(of: &Number){ $0.map{ UInt8($0) } }) 14let data: Data = Data(byteArray) 15 16skipCharacteristic = CBMutableCharacteristic(type: UUID1, properties: prop1, value: data, permissions: perm1) 17inCharacteristic = CBMutableCharacteristic(type: UUID2, properties: prop2, value: nil, permissions: perm2) 18 19...... 20 21func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) { 22 /// readRequestの処理 23 let canAnswerRequest = answerReadRequest(request: request) 24 25 if canAnswerRequest { 26 peripheralManager.respond(to: request, withResult: CBATTError.success) 27 } else { 28 peripheralManager.respond(to: request, withResult: CBATTError.invalidHandle) 29 } 30} 31 32/// request を個別に処理する関数 33func answerReadRequest(request: CBATTRequest) -> Bool{ 34 var result: Bool = true 35 36 if ( request.characteristic.uuid == UUID1 ) { 37 print("recieve skipCharacteristic") 38 request.value = skipCharacteristic!.value 39 peripheralManager.respond(to: request, withResult: .success) 40 } else if ( request.characteristic.uuid == UUID2 ) { 41 print("recieve inCharacteristic") 42 let newData = makeData() 43 request.value = data 44 inCharacteristic.value = data 45 _ = peripheralManager.updateValue(inCharacteristic!.value!, for: inCharacteristic!, onSubscribedCentrals: nil) 46 } else { 47 /// ここに入った場合のみ失敗 48 print("unknown request") 49 print("uuid = (request.characteristic.uuid)") 50 result = false 51 } 52 53 return result 54} 55 56func makeData() -> Data{ 57 myClass.counter += 1 58 var array = [UInt8]() 59 array.append(contentsOf: withUnsafeBytes(of: &myClass.counter){ $0.map{ UInt8($0) } }) 60 61 let returnData = Data(array) 62 63 return returnData 64}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/06 07:35