【问题标题】:PHFetchResult extension that uses it's Generic ObjectType?使用它的 Generic ObjectType 的 PHFetchResult 扩展?
【发布时间】:2018-03-27 21:09:06
【问题描述】:

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

【问题讨论】:

    标签: swift generics swift4 extension-methods phphotolibrary


    【解决方案1】:

    这是在 ObjC 中定义并导入 Swift 的泛型类型的普遍问题。一些相关的编译器错误:

    简而言之:ObjC 泛型是类型擦除的,Swift 泛型是类型保留的。你需要后者来完成诸如定义类型约束扩展之类的任务,但你不能这样做,因为 Swift 对任何特定 PHFetchResult 实例的 ObjectType 一无所知。

    为 Swift 3 带来广泛的 ObjC 泛型导入的 swift-evolution 提案包括一项规定,允许 ObjC 类在运行时提供有关其泛型类型参数的信息……但截至今天,该规定从未实施过。

    AFIAK,这个问题并没有真正的解决方案(缺少致力于改进 ObjC 泛型支持的 Swift 编译器项目),也没有类似的问题,例如使 PHFetchResult 符合 SequenceCollection

    (我自己尝试了几个角度来扩展 PhotoKit 类以使其更加 Swifty,但没有取得多大成功。关于我唯一没有尝试过的事情——主要是因为它是一个非常激烈的措施——是包装/替换大块API。不过,理论上,您可以将 PHFetchResult 包装在非泛型 ObjC 类中,然后将其包装在泛型 Swift 类型中,并将所有 PhotoKit 获取方法替换为提供适当专用版本的包装器类型的方法.)

    【讨论】:

    • 感谢您的回答 - 非常有用 - 我至少很高兴在这种情况下丑陋的解决方案有效。
    • 嘿@rickster!我想知道是否有关于“ObjectType”的 any 文档。我想了解它的来源和行为方式。
    • ObjectType 是一个泛型类型参数,而不是它本身的类型。它是任何类型的占位符,因此它没有像真正类型那样的文档。查看 Xcode 中 PHFetchResult 的声明,和/或 Swift 语言指南中的泛型部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2018-04-21
    • 1970-01-01
    • 2012-10-17
    • 2021-09-29
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多