CLPeripheralManager.startAdvertising не принимает возвращаемое значение CLBeaconRegion.peripheralDataWithMeasuredPower

Согласно документации Swift 2.0 для CLBeaconRegion, все еще должно быть возможно передать вывод peripheralDataWithMeasuredPower: метод к startAdvertising: метод CLPeripheralManager,

Получение данных рекламы Beacon

- peripheralDataWithMeasuredPower:

Извлекает данные, которые можно использовать для рекламы текущего устройства в качестве маяка.

декларация

СВИФТ

func peripheralDataWithMeasuredPower(_measuredPower: NSNumber?) -> NSMutableDictionary

Objective-C

- (NSMutableDictionary<NSString *,id> * _Nonnull)peripheralDataWithMeasuredPower:(NSNumber * _Nullable)measuredPower

параметры

measuredPower Значение индикатора уровня принятого сигнала (RSSI) (измеряется в децибелах) для устройства. Это значение представляет собой измеренную силу маяка на расстоянии одного метра и используется во время измерения дальности. Уточнить nil использовать значение по умолчанию для устройства.

Возвращаемое значение

Словарь данных, который вы можете использовать вместе с CBPeripheralManager рекламировать текущее устройство как маяк.

обсуждение

Возвращенный словарь кодирует идентификационную информацию маяка вместе с другой информацией, необходимой для рекламы маяка. Вам не нужно напрямую обращаться к содержимому словаря. Передайте словарь startAdvertising: метод CBPeripheralManager начать рекламу маяка.

Доступность

Доступный в iOS 7.0 и позже.

Тем не мение, peripheralDataWithMeasuredPower: возвращает NSMutableDictionary тогда как startAdvertising: метод CLPeripheralManager принимает быстрый словарь [String : AnyObject]?хотя документация утверждает, что она принимает NSDictionary, Следующий код, который работал в Swift 1.0:

// Set up a beacon region with the UUID, Major and Minor values
let region = CLBeaconRegion(proximityUUID:beaconUUID!, major:withMajor.unsignedShortValue, minor:withMinor.unsignedShortValue, identifier:"com.example.beacon")

// Attempt to set up a peripheral with the measured power
let peripheralData = region.peripheralDataWithMeasuredPower(withPower) 
_peripheralManager!.startAdvertising(peripheralData)

В Swift 2.0 один и тот же код не компилируется с предупреждением: не компилируется с предупреждением:

NSDictionary не конвертируется в [String : AnyObject]; ты хотел использовать as! заставить опуститься?

Однако, принуждение к падению всегда терпит неудачу.

Это ошибка документации, ошибка в Swift 2.0, или я что-то упустил?

1 ответ

Кажется, проблема в том, что NSMutableDictionary не легко конвертируется в Swift Dictionary, но NSDictinoary является. Так что я закончил преобразование NSMutableDictionary к NSDictinoary первый:

let pd = NSDictionary(dictionary: region.peripheralDataWithMeasuredPower(nil))
         as! [String: AnyObject]
peripheralManager.startAdvertising(pd)

И это работает!

Другие вопросы по тегам