gpt4 book ai didi

Swift 2.x 到 swift 3,XCode 报错 : Cannot convert value of type PHFetchResult

转载 作者:行者123 更新时间:2023-11-28 10:17:04 25 4
gpt4 key购买 nike

这是我的代码:

    var galleryController: GalleryController!
var albums: PHFetchResult = PHFetchResult()
var cameraRoll: [PHFetchResult] = [PHFetchResult]()

albums=getAlbums()
cameraRoll=getcameraRoll()

func getAlbums()->PHFetchResult<AnyObject>
{
let fetchOptions=PHFetchOptions()
fetchOptions.predicate=NSPredicate(format:"estimatedAssetCount > 0")
return PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.album, subtype: PHAssetCollectionSubtype.albumSyncedAlbum, options: fetchOptions) as! PHFetchResult<AnyObject>
}

func getcameraRoll()->[PHFetchResult<AnyObject>]
{
self.photosFromCameraRoll=PHAsset.fetchAssets(with: PHAssetMediaType.image, options: nil)
return [self.photosFromCameraRoll]
}

对于行 var albums: PHFetchResult = PHFetchResult() Xcode 正在处理此消息:“无法将 PHFetchResult<_> 类型的值转换为指定的 PHFetchResult”

对于行 var cameraRoll: [PHFetchResult] = [PHFetchResult]() Xcode 也符合相同的消息:“无法将 PHFetchResult<_> 类型的值转换为指定的 PHFetchResult”

最佳答案

在 Swift 3 中,PHFetchResult是一个泛型类。 (它自去年的 iOS 9 SDK 和 Swift 3 now imports ObjC generics 以来一直在 ObjC 中。)通用类型必须始终是专用的。在 ObjC 中,泛型类可以使用或不使用类型参数(也就是说,您可以使用 PHFetchResult<SomeObjectType *> *PHFetchResult *,在后一种情况下,类型参数假定为 id)。但在 Swift 中你不能——你总是必须声明一个元素类型。

因此,如果您要声明一个变量来保存照片获取结果,则需要声明这些获取结果的预期对象类型。

  • 您的第一个看起来应该是专辑列表 — 可能会通过 fetchTopLevelUserCollections(with:) 获取?所以它的类型应该是PHFetchResult<PHCollection>PHFetchResult<PHAssetCollection>具体取决于您使用的是哪种提取方法以及您下一步打算用它做什么。

  • 第二个是获取结果的数组?考虑到变量名称 cameraRoll,这本身就听起来很可疑.如果你只想获取相机胶卷中的所有 Assets ,只需使用 fetchAssets(in:options:) ,将相机胶卷作为要从中获取的集合传递。 (您可以使用 fetchAssetCollections(with:subtype:options:) 获取相机胶卷,使用 .smartAlbum 类型和 .smartAlbumUserLibrary 子类型。)

    无论是单个抓取结果还是抓取结果数组,如果您希望抓取包含 Assets ,则类型(或数组的元素类型)应为 PHFetchResult<PHAsset> .


您的代码的第二个更小的问题是,您正在创建虚拟的、空的获取结果,只是为了让它们(大概)在以后被实际获取覆盖。 (PHFetchResult 是一个不可变集合,因此它的初始化程序创建了一个空集合,您无法对其进行任何操作。)

你最好用可选类型声明这些变量(或者,如果你计划尽早初始化它们并期望之后的所有代码路径都在初始化之后出现,则隐式解包可选类型)。或者,如果它适合您的用例,让它们变得懒惰:

class PhotosAlbumsController: UITableViewController {

var galleryController: GalleryController!

lazy var albums = PHCollection.fetchTopLevelUserCollections(with: nil)
// ^- implicitly typed PHFetchResult<PHCollection>

lazy var cameraRoll = PHAssetCollection.fetchAssetCollections(with: .smartAlbum,
subtype: .smartAlbumUserLibrary, options: nil).firstObject!
// ^- implicitly typed PHAssetCollection
// safe to force unwrap because there's always a Camera Roll / Saved Photos album

// ...
}

这里使用惰性初始化(无论您使用 lazy 还是通过在其他时间直接获取)要注意的一件事是确保您首先拥有照片访问的用户授权,和/或确保您注册为 PHPhotoLibrary观察者优先。如果您在获得授权之前获取,您的获取将为空。如果您首先注册为观察员,您的抓取仍然是空的,但一旦用户接受授权,您将获得 photoLibraryDidChange。调用填充它们。

关于Swift 2.x 到 swift 3,XCode 报错 : Cannot convert value of type PHFetchResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40092101/

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