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
который в свою очередь может быть брошен в SwiftDictionary
,- Значение
kDADiskDescriptionVolumeNetworkKey
ключ являетсяCFBoolean
который может быть брошен в SwiftBool
,
Пример:
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]