我试图为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
}
}
答案 0 :(得分:2)
这是在ObjC中定义并导入到Swift的泛型类型的一般问题。一些相关的编译器错误:
简而言之:ObjC泛型是类型擦除,Swift泛型是类型保留。你需要后者来完成定义类型约束扩展等任务,但是你不能因为Swift对任何特定PHFetchResult
实例的ObjectType都不了解。
将Swj3广泛引入ObjC泛型的swift-evolution提案包括允许ObjC类在运行时提供有关其泛型类型参数的信息......但截至今天,该规定从未实现过。
AFIAK,这个问题并不是真正的解决方案(缺少Swift编译器项目以改进ObjC泛型支持),也没有使PHFetchResult
符合Sequence
等类似问题或Collection
。
(我已经尝试了几个角度来扩展PhotoKit课程,让自己更加狡猾,没有太大的成功。关于我唯一没有尝试过的东西 - 主要是因为它是如此激烈的措施 - 包装/替换API的大块。理论上,您可以将PHFetchResult
包装在非泛型的ObjC类中,然后将其包装在通用的Swift类型中,并将所有的PhotoKit获取方法替换为提供包装类型的适当专用版本的那些。)