2015-08-04 5 views
3

Ok, так что в Swift 2, определение IORegistryEntryCreateCFProperties являетсяSwift2: Правильный способ инициализирует UnsafeMutablePointer <? Неуправляемый <CFMutableDictionary>> параметр перейти к IORegistryEntryCreateCFProperties

func IORegistryEntryCreateCFProperties(entry: io_registry_entry_t, _ properties: UnsafeMutablePointer<Unmanaged<CFMutableDictionary>?>, _ allocator: CFAllocator!, _ options: IOOptionBits) -> kern_return_t 

я могу сделать

var dict: UnsafeMutablePointer<Unmanaged<CFMutableDictionary>?> = nil 
kr = IORegistryEntryCreateCFProperties(box as io_registry_entry_t, dict, kCFAllocatorDefault, nilOptions) 

, который компилируется и запускается. Конечно, он сбой, когда он выполняет IORegistryEntryCreateCFProperties, потому что dict инициализирован до nil. Мой вопрос в том, как инициализировать dict до значения, отличного от нуля? Я пробовал разные подходы без успеха.

ответ

5

Параметр типа

UnsafeMutablePointer<Unmanaged<CFMutableDictionary>?> 

означает, что вы должны передать переменную типа

Unmanaged<CFMutableDictionary>? 

как Inout-спор с &. При успехе вы можете развернуть дополнительный (с дополнительной привязкой), преобразовать неуправляемый объект в управляемый объект с помощью takeRetainedValue() и, наконец, (если хотите), наведите CFMutableDictionary на NSDictionary.

Пример:

var props : Unmanaged<CFMutableDictionary>? 
if IORegistryEntryCreateCFProperties(entry, &props, kCFAllocatorDefault, 0) == KERN_SUCCESS { 
    if let props = props { 
     let dict = props.takeRetainedValue() as NSDictionary 
     print(dict) 
    } 
}