Данные из messages.userInfo - PullRequest
       21

Данные из messages.userInfo

0 голосов
/ 27 ноября 2018

Я читаю usb-rawHID-устройство с

var read_byteArray = [UInt8](repeating: 0x00, count: BUFFER_SIZE)
var result = rawhid_recv(0, &read_byteArray, Int32(BUFFER_SIZE), 50)

Я могу прочитать read_byteArray с

for  i in 0...16
        {
           print(" \(read_byteArray[i])", terminator: "")
        }

+++ new read_byteArray в таймере: 0 969 0 0, ...

Затем я хочу распространить данные с уведомлением.

        let nc = NotificationCenter.default
        nc.post(name:Notification.Name(rawValue:"newdata"),
                object: nil,
                userInfo: ["data":read_byteArray])

Я регистрирую уведомление и читаю его с

@objc func newDataAktion(_ notification:Notification) 
{
  print("new Data")
  let data = notification.userInfo?["data"]
  print("data: \(String(describing: data)) \n") // data: Optional([0, 9, 51, 0,....
  if let d = notification.userInfo!["data"] 
  {
     print("d: \(d)\n") // d: [0, 9, 56, 0, 0,... 
     let t = type(of:d)
     print("typ: \(t)\n") // typ: Array<UInt8>
  }   
}

Данные имеют тип Array, но мои попытки прочитать элемент этого массива с помощью

print("element: \(d[1])\n")

дают мне ошибку

Тип 'Any' не имеет индексаmembers

Как получить элементы UInt8 из данных?

1 Ответ

0 голосов
/ 28 ноября 2018

Пользовательский информационный словарь имеет тип [String: Any], поэтому при извлечении ключа из него следует также привести его к правильному типу (в противном случае он заключен в Any и не является массивом; type(of:) может сказать,Вы [UInt8] во время выполнения, но компилятор не может знать об этом во время компиляции, пока вы не скажете):

  if let d = notification.userInfo?["data"] as? [UInt8] {
     d.forEach{ print($0) }
  }
...