我在访问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 方法?我如何实现这一目标?
答案 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