swift 3,PHFetchResult.enumerateObjects错误

six*_*six 7 swift3

在swift 3中,该方法向我显示"模糊地使用'enumerateObjects'",发生了什么.我该怎么办?

extension PHFetchResult {
public func assetCollection() -> [PHAssetCollection] {
    var list :[PHAssetCollection] = []
    self.enumerateObjects { (object, index, stop) in
        if object is PHAssetCollection {
            let collection = object as! PHAssetCollection
            list.append(collection)
        }
    }
    return list
}
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*nee 14

Swift 3.0:只需在enumerateObjects之后添加Curly Brackets之前添加Round Brackets.

extension PHFetchResult {
  public func assetCollection() -> [PHAssetCollection] {
    var list :[PHAssetCollection] = []
    self.enumerateObjects ({ (object, index, stop) in
        if object is PHAssetCollection {
            let collection = object as! PHAssetCollection
            list.append(collection)
        }
    })
    return list
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 3

做这样的事情吧。您不能直接添加扩展名,PHFetchResult因为它有其他 ObjectType 作为其通用参数PHFetchResult<ObjectType>。所以你必须做点别的事情。

class FetchPhoto {

    class func assetCollection() -> [PHAssetCollection] {
        var list :[PHAssetCollection] = []

        PHAssetCollection.fetchMoments(with: nil).enumerateObjects(EnumerationOptions.concurrent) { (collection, _, _) in
                list.append(collection)
        }

        return list
    }
}
Run Code Online (Sandbox Code Playgroud)

PHAssetCollection.fetchMomentsPHFetchResult<PHAssetCollection>这里返回的PHAssetCollectionObjectTypePHFetchResult。您收到了不明确的错误,因为您尚未指定 objectType。

解决这个问题的通用方法。

 class FetchPhoto {

    class func assetCollection<T : PHObject>(result : PHFetchResult<T>) -> [T] {

        var list : [T] = []

        result.enumerateObjects(EnumerationOptions.concurrent) { (object, _, _) in
            list.append(object)
        }

        return list
    }
}
Run Code Online (Sandbox Code Playgroud)

雨燕3

    class PhotosHelper {

        class func fetchAllLocalIdentifiersOfPhotos(completion : (_ localIdentifiers : [String]) -> ()) {

            let photos : PHFetchResult<PHAsset> = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: nil)
            photos.enumerateObjects ({ _,_,_ in

// Do your operations, you can see that there is no warnings/errors in this one
            })

        }
    }
Run Code Online (Sandbox Code Playgroud)