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

标签 swift generics swift4 extension-methods phphotolibrary

我正在尝试向 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/

相关文章:

ios - 内存泄漏问题

ios - 从 UITableView 中的多维数组传递数据

java - LinkedList 的 add 方法(带有父类(super class)型)不是一切都好吗?

swift - 根据 SDWebImage 图像高度调整表格 View 高度

arrays - Swift 4 将项目 append 到结构化数组中的特定部分

c++ - 尝试从 Swift 调用 C++ 代码时出现链接器错误

swift - Firebase 项目在数据库更改的 Collection View 中多次返回

java - 克服泛型投入-获取规则

c# - 为什么我不能在泛型类中使用采用不同泛型类型参数的方法?

ios - NSMutableAttributedString文本颜色无法正常工作