You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为PHFetchResult编写通用扩展,避免重复的类型约束实现代码?

解决PHFetchResult扩展重复代码的通用方案

这确实是个很常见的重复代码痛点——为每个PHObject子类写几乎一模一样的PHFetchResult扩展,不仅冗余还容易出错!其实我们可以利用Swift的泛型约束来写一个通用的扩展,一次性解决所有PHObject子类的需求,而且完全保持类型安全,不用事后强制转换。

通用扩展代码

import Photos

extension PHFetchResult where ObjectType: PHObject {
    var objects: [ObjectType] {
        var resultArray: [ObjectType] = []
        enumerateObjects { object, _, _ in
            resultArray.append(object)
        }
        return resultArray
    }
}

为什么这能解决问题?

这个扩展对所有PHFetchResult<ObjectType>生效,只要ObjectType是PHObject的子类——而Photos框架里的可获取对象(比如PHAsset、PHCollection、PHFace等)全部符合这个条件。

当你使用具体类型的PHFetchResult时,objects属性会自动返回对应类型的数组:

  • 对于PHFetchResult<PHAsset>,返回[PHAsset]
  • 对于PHFetchResult<PHCollection>,返回[PHCollection]

完全不需要任何强制转换,和你之前单独为每个类型写的扩展效果完全一致,但只需要写一次代码!

使用示例

// 获取图片资产列表
let imageAssetsResult = PHAsset.fetchAssets(with: .image, options: nil)
let imageAssets: [PHAsset] = imageAssetsResult.objects

// 获取顶层用户相册列表
let collectionsResult = PHCollectionList.fetchTopLevelUserCollections(with: nil)
let collections: [PHCollectionList] = collectionsResult.objects

这样就彻底消除了重复代码,同时保持了类型安全,完美解决你之前的困扰~

内容的提问来源于stack exchange,提问作者Mike Bedar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:33:41