【发布时间】:2018-02-17 18:58:03
【问题描述】:
我正在尝试通过单击按钮通过蓝牙发送数据。我可以在使用以下代码打开应用程序时发送数据:
var manager: CBCentralManager!
var device: CBPeripheral?
var characteristics: [CBCharacteristic]?
var serviceUUID = "1234"
var char1 = "FFE1"
let deviceName = "HMSoft"
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
DidDiscoverChar.text = "Characteristic found!"
device = peripheral
characteristics = service.characteristics
var value: UInt8 = 1
let data = NSData(bytes: &value, length: MemoryLayout<UInt8>.size)
for characteristic in service.characteristics as [CBCharacteristic]!
{
if(characteristic.uuid.uuidString == "FFE1")
{
device?.writeValue(data as Data, for: characteristic,type: CBCharacteristicWriteType.withoutResponse)
}
}
}
但是当我尝试用按钮发送它时:
@IBAction func ledOn(_ sender: AnyObject) {
var value: UInt8 = 1
let data = NSData(bytes: &value, length: MemoryLayout<UInt8>.size)
device?.writeValue(data as Data, for: characteristics,type: CBCharacteristicWriteType.withoutResponse)
}
我得到错误:
无法转换类型“[CBCharacteristic]?”的值到预期的参数类型'CBCharacteristic'
这似乎是一项简单的任务,但作为一个新手,我被卡住了。
编辑:(回复 rmaddy 的回答)
按照您的建议,它确实可以遍历数组,如下所示。
@IBAction func ledOn(_ sender: AnyObject) {
var value: UInt8 = 1
let data = NSData(bytes: &value, length: MemoryLayout<UInt8>.size)
for characteristic in characteristics as [CBCharacteristic]!
{
if(characteristic.uuid.uuidString == "FFE1")
{
device?.writeValue(data as Data, for: characteristic,type: CBCharacteristicWriteType.withoutResponse)
}
}
}
作为一名程序员,我想提高自己,我希望代码更高效。所以我想我可以在按钮功能之外进行迭代,以避免每次按下按钮时的迭代。为了说明我在操场上做了一个简单的例子:
var characteristicFFE1: String = ""
var array = ["r1", "r2", "r3", "FFE1", "r4"]
for uuidString in array {
if uuidString == "FFE1" {
characteristicFFE1 = uuidString
}
}
然后在IBAction的writeValue中直接使用characteristicFFE1,如下所示:
@IBAction func ledOn(_ sender: AnyObject) {
var value: UInt8 = 1
let data = NSData(bytes: &value, length: MemoryLayout<UInt8>.size)
device?.writeValue(data as Data, for: characteristicsFFE1,type: CBCharacteristicWriteType.withoutResponse)
}
我尝试完成上面的,如下图:
var characteristicFFE1: CBCharacteristic?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
for characteristic in characteristics as [CBCharacteristic]! //ERROR HERE
{
if(characteristic.uuid.uuidString == "FFE1")
{
characteristicFFE1 = characteristic
}
}
但我收到错误:线程 1:致命错误:在展开可选值时意外发现 nil。
有人知道如何解决这个问题吗?我已经阅读了有关可选和展开的信息,但在这里仍然感到困惑。
【问题讨论】:
-
究竟是哪一行导致了错误?
-
IBAction 函数的最后一行,"characteristics" 导致它。
标签: swift button bluetooth bluetooth-lowenergy