質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

16839閲覧

Value of type "A" has no member "B" の原因が分かりません

inui1234

総合スコア12

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/06/25 09:51

swift初学者です。iOSでBLEのペリフェラル側のコーディングをしていますがエラーが出てしまいました。エラー内容は「Value of type "ViewController" has no member "self.characteristic" 」です。存在しないメンバというエラーですが、「let characteristic = CBMutableCharacteristic」の箇所で宣言しているはずなのではないかと思っています。

コード全体

swift

1import CoreBluetooth 2 3class ViewController: UIViewController, CBPeripheralManagerDelegate { 4 5 var peripheralManager: CBPeripheralManager! 6 //サービス・キャラクタリスティックのUUID設定 7 let serviceUUID = CBUUID(string: "BAAE42F6-A34F-497F-A3D3-6B97FD12B086") 8 let characteristicUUID = CBUUID(string: "1565E8AE-E3DD-4F5F-B02B-A304946E2ABE") 9 //ランダムな値を生成しDeviceNameに設定 10 let DeviceName: String = "\(arc4random()%100000)" 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 // Do any additional setup after loading the view, typically from a nib. 15 16 // ペリフェラルマネージャ初期化 17 self.peripheralManager = CBPeripheralManager( 18 delegate: self, 19 queue: nil, 20 options: nil) 21 } 22 23 override func didReceiveMemoryWarning() { 24 super.didReceiveMemoryWarning() 25 // Dispose of any resources that can be recreated. 26 } 27 28 //ペリフェラルマネージャのstate取得メソッド 29 func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager) { 30 switch peripheral.state { 31 case CBPeripheralManagerState.PoweredOn: 32 print("ペリフェラルマネージャがオン") 33 34 publishService() 35 case CBPeripheralManagerState.PoweredOff: 36 print("ペリフェラルマネージャがオフ") 37 38 default: 39 break 40 41 } 42} 43 44 //アドバタイズ開始処理結果取得メソッド 45 func peripheralManagerDidStartAdvertising(peripheral: CBPeripheralManager, error: NSError?) { 46 47 if (error != nil) { 48 print("アドバタイズ開始失敗 error: \(error)") 49 return 50 } 51 52 print("アドバタイズ開始成功") 53 } 54 55 func startAdvertise() { 56 //アドバタイズメントデータの設定 57 var advertisementData = [String:AnyObject]() 58 advertisementData = [CBAdvertisementDataLocalNameKey:DeviceName, 59 CBAdvertisementDataServiceUUIDsKey:[serviceUUID]] 60 //アドバタイズ開始 61 self.peripheralManager.startAdvertising(advertisementData) 62 } 63 64 //サービスとキャラクタリスティックの作成。ペリフェラルマネージャーがオンの時呼ばれるメソッド 65 func publishService() { 66 //サービスの作成 67 let service = CBMutableService(type: serviceUUID, primary: true) 68 //キャラクタリスティックのプロパティ設定 69 let properties: CBCharacteristicProperties = [CBCharacteristicProperties.Notify, CBCharacteristicProperties.Read, CBCharacteristicProperties.Write] 70 //キャラクタリスティックのパーミッション設定 71 let permissions: CBAttributePermissions = [CBAttributePermissions.Readable, CBAttributePermissions.Writeable] 72 73 //キャラクタリスティック設定 74 let characteristic = CBMutableCharacteristic( 75 type: characteristicUUID, 76 properties: properties, 77 permissions: permissions) 78 79 //サービスにキャラクタリスティックの追加 80 service.characteristics = [characteristic] 81 //ペリフェラルにサービス追加 82 self.peripheralManager.addService(service) 83 } 84 85 //サービス追加結果取得、サービス追加処理が完了すると呼ばれる 86 func peripheralManager(peripheral: CBPeripheralManager, didAddService service: CBService, error: NSError?) { 87 88 if (error != nil) { 89 print("サービス追加失敗 error: \(error)") 90 return 91 } 92 93 print("サービス追加成功") 94 } 95 96 //Readリクエストを受け取ると呼ばれるメソッド 97 func peripheralManager(peripheral: CBPeripheralManager, didReceiveReadRequest request: CBATTRequest) { 98 print("リードリクエスト受信") 99 } 100 101 //Writeリクエストを受け取ると呼ばれるメソッド 102 func peripheralManager(peripheral: CBPeripheralManager, 103 didReceiveWriteRequests requests: [CBATTRequest]//配列として入っている 104 ) { 105 print("ライトリクエスト受信") 106 } 107 108 //Notify開始リクエストを受け取る 109 func peripheralManager(peripheral: CBPeripheralManager, central: CBCentral, didSubscribeToCharacteristic characteristic: CBCharacteristic) { 110 111 print("Notify開始リクエストを受信") 112 113 } 114 115 //Notify停止リクエストを受け取る 116 func peripheralManager(peripheral: CBPeripheralManager, central: CBCentral, didUnsubscribeFromCharacteristic characteristic: CBCharacteristic) { 117 print("Notify停止リクエストを受信") 118 } 119 func answer(str: String) { 120 self.peripheralManager.updateValue( 121 str2data(str), 122 forCharacteristic: self.characteristic, 123 onSubscribedCentrals: nil) 124 } 125 126 func stopAdvertise() { 127 peripheralManager.stopAdvertising() 128 } 129 130 //StringをNSDataに変換するメソッド 131 func str2data(str:String) -> NSData { 132 return str.dataUsingEncoding(NSUTF8StringEncoding)! 133 } 134 //NSDataをStringに変換するメソッド 135 func data2str(data: NSData) -> String { 136 return String(data:data, encoding:NSUTF8StringEncoding)! 137 } 138}

エラー箇所

swift

1 func answer(str: String) { 2 self.peripheralManager.updateValue( 3 str2data(str), 4 forCharacteristic: self.characteristic, //この行でエラー 5 onSubscribedCentrals: nil)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

詳しくないので間違えているかもしれませんが、var characteristic: CBMutableCharacteristic!がインスタンス変数として保持されていないからなのでは無いでしょうか?

swift

1class ViewController: UIViewController, CBPeripheralManagerDelegate { 2 3 var characteristic: CBMutableCharacteristic! 4 ........ 5 6 func publishService() { 7 ........ 8 9 //キャラクタリスティック設定 10 characteristic = CBMutableCharacteristic( 11 type: characteristicUUID, 12 properties: properties, 13 permissions: permissions) 14 ........

あと貼り付けてキャラクタリスティック設定の部分もエラーになっていました、引数の数が違うみたいです。

swift

1// value: を追加 2 3//キャラクタリスティック設定 4characteristic = CBMutableCharacteristic( 5 type: characteristicUUID, 6 properties: properties, 7 value: nil, 8 permissions: permissions)

投稿2016/06/25 10:12

編集2016/06/25 10:19
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問