如何为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
相关产品推荐
相关产品推荐

