我正在尝试向 PHFetchResult 添加扩展以将结果对象作为正确类型的数组拉出 - 到目前为止,我无法弄清楚如何避免下面看到的复制。除了类型约束之外,以下扩展是相同的。如果我使用 PHObject 作为约束,它会起作用,但结果需要转换为更具体的类型......
extension PHFetchResult where ObjectType == PHAsset {
var objects: [ObjectType] {
var _objects: [ObjectType] = []
enumerateObjects { (object, _, _) in
_objects.append(object)
}
return _objects
}
}
extension PHFetchResult where ObjectType == PHCollection {
var objects: [ObjectType] {
var _objects: [ObjectType] = []
enumerateObjects { (object, _, _) in
_objects.append(object)
}
return _objects
}
}
extension PHFetchResult where ObjectType == PHAssetCollection {
var objects: [ObjectType] {
var _objects: [ObjectType] = []
enumerateObjects { (object, _, _) in
_objects.append(object)
}
return _objects
}
}
最佳答案
这是在 ObjC 中定义并导入到 Swift 中的泛型类型的普遍问题。一些相关的编译器错误:
- [SR-1576] Swift 3 can't subscript PHFetchResult
- [SR-2708] Extending ObjC generics in Swift 3 does not compile
简而言之:ObjC 泛型是类型删除,Swift 泛型是类型保留。您需要后者来完成诸如定义类型受限扩展之类的任务,但您不能这样做,因为 Swift 对任何特定 PHFetchResult
实例的 ObjectType 一无所知。
将广泛的 ObjC 泛型导入 Swift 3 的 swift-evolution 提案包括一项规定,允许 ObjC 类在运行时提供有关其泛型类型参数的信息……但截至今天,该规定从未实现。
AFIAK,这个问题并没有真正的解决方案(缺少 Swift 编译器项目以改进 ObjC 泛型支持),也没有类似的问题,例如使 PHFetchResult
符合 Sequence
或集合
。
(我自己尝试了几个角度来扩展 PhotoKit 类以使其更加 Swifty,但没有取得太大的成功。我唯一没有尝试过的事情——主要是因为这是一个如此激进的措施——是包装/替换大块的API。不过,理论上,您可以将 PHFetchResult
包装在一个非通用的 ObjC 类中,然后将其包装在一个通用的 Swift 类型中,并将所有 PhotoKit 获取方法替换为提供适当专用的方法你的包装器类型的版本。)
关于swift - 使用它的通用 ObjectType 的 PHFetchResult 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49522436/