CFDictionary在Swift3中获得Key的值

时间:2017-03-14 12:54:38

标签: swift cfdictionary

我在访问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 个答案:

答案 0 :(得分:3)

不要在Swift中使用CFDictionary。 (有可能,但不值得努力,见下文。)

  • CFDictionary是免费的 与NSDictionary桥接,然后可以转换为Swift Dictionary
  • kDADiskDescriptionVolumeNetworkKey键的值是a 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)
            }
        }
    }
}

只是为了完整性:这是必要的指针 玩杂耍在Swift 3中调用CFDictionaryGetValue

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)
            }
        }
    }
}

答案 1 :(得分:0)

您可以将Child转换为Swift词典:

CFDictionaryRef

然后将if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL), let diskinfo = DADiskCopyDescription(disk) as? [String: AnyObject] { } 转换为Swift字符串:

kDADiskDescriptionVolumeNetworkKey