这个答案是 Ken Thomases's Objective-C answer 的 Swift 1.2 的翻译。
所有功劳归于 Ken Thomases,这只是他出色答案的翻译。
let listBase = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListFavoriteVolumes.takeUnretainedValue(), NSMutableDictionary())
let list = listBase.takeRetainedValue() as LSSharedFileList
var seed:UInt32 = 0
let itemsCF = LSSharedFileListCopySnapshot(list, &seed)
if let items = itemsCF.takeRetainedValue() as? [LSSharedFileListItemRef] {
for item in items {
let icon = LSSharedFileListItemCopyIconRef(item)
let image = NSImage(iconRef: icon)
// use image ...
}
}
解释:
在从 Objective-C 翻译 Ken 的答案以尝试使用它时,我遇到了一些困难,这就是我做出这个答案的原因。
第一个问题是LSSharedFileListCreate,Swift 中的方法签名不接受nil 作为它的第一个参数。我必须找到一个代表CFAllocator 的常量:kCFAllocatorDefault。第三个参数也不接受nil,所以我放了一个虚拟的未使用的 NSMutableDictionary 来让编译器满意。
此外,LSSharedFileListCopySnapshot 的“种子”参数不接受通常的 var seed:Uint32? 用于 inout,我必须为 seed 提供默认值。
为了决定在使用这些 API 时何时使用 takeRetainedValue 或 takeUnRetainedValue,我参考了 this answer。
最后,我必须将返回的数组转换为 LSSharedFileListItemRef 元素的 Swift 数组(最初由编译器推断为 CFArray)。
更新
这已在 OS X El Capitan 10.11 中被弃用(感谢@patmar)
更新 2
请注意,虽然它已被弃用,但它仍然有效。在之前的解决方案中转换为 [LSSharedFileListItemRef] 现在已被忽略,因此我们必须转换为 NSArray,然后再转换该项目:
if let items = itemsCF.takeRetainedValue() as? NSArray {
for item in items {
let icon = LSSharedFileListItemCopyIconRef(item as! LSSharedFileListItem)
let image = NSImage(iconRef: icon)
// use image ...
}
}