gpt4 book ai didi

swift - 使用它的通用 ObjectType 的 PHFetchResult 扩展?

转载 作者:搜寻专家 更新时间:2023-11-01 06:29:18 25 4
gpt4 key购买 nike

我正在尝试向 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 中的泛型类型的普遍问题。一些相关的编译器错误:

简而言之: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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com