CFDictionary получить значение для ключа в Swift3

У меня проблема с доступом к определенному (или любому) ключу в CFDictionary. Честно говоря, я не совсем понимаю, как вам нужно это делать в Swift, и я думаю, что это слишком сложно...

Мой код:

if let session = DASessionCreate(kCFAllocatorDefault) {
let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: [], options: [])!
for volume in mountedVolumes {
    if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL) {
        let diskinfo = DADiskCopyDescription(disk);   

        var volumeValue = CFDictionaryGetValue(diskinfo, <#T##key: UnsafeRawPointer!##UnsafeRawPointer!#>)


    }
}

Чего я хочу добиться: получить значение для ключа или поле DAVolumeNetwork в переменную volumeValue. Я думаю, мне нужно передать kDADiskDescriptionVolumeNetworkKey в метод CFDictionaryGetValue? Как мне этого добиться?

2 ответа

Решение

Не использовать CFDictionary в Свифте. (Это возможно, но не стоит усилий, см. Ниже.)

  • CFDictionary бесплатно соединяется с NSDictionaryкоторый в свою очередь может быть брошен в Swift Dictionary,
  • Значение kDADiskDescriptionVolumeNetworkKey ключ являетсяCFBoolean который может быть брошен в Swift Bool,

Пример:

if let session = DASessionCreate(kCFAllocatorDefault),
    let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: []) {
    for volume in mountedVolumes {
        if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL),
            let diskinfo = DADiskCopyDescription(disk) as? [NSString: Any] {

            if let networkValue = diskinfo[kDADiskDescriptionVolumeNetworkKey] as? Bool {
                print(networkValue)
            }
        }
    }
}

Просто для полноты: это необходимое манипулирование указателем для вызова CFDictionaryGetValue в Свифте 3:

if let session = DASessionCreate(kCFAllocatorDefault),
    let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: []) {
    for volume in mountedVolumes {
        if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL),
            let diskinfo = DADiskCopyDescription(disk) {

            if let ptr = CFDictionaryGetValue(diskinfo, Unmanaged.passUnretained(kDADiskDescriptionVolumeNetworkKey).toOpaque()) {
                let networkValue = Unmanaged<NSNumber>.fromOpaque(ptr).takeUnretainedValue()
                print(networkValue.boolValue)
            }
        }
    }
}

Вы можете разыграть CFDictionaryRef в словарь Swift:

if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL), let diskinfo = DADiskCopyDescription(disk) as? [String: AnyObject] {
}

а затем бросить kDADiskDescriptionVolumeNetworkKey к быстрой строке:

var volumeValue = diskinfo[kDADiskDescriptionVolumeNetworkKey as String]
Другие вопросы по тегам