2016-06-20 9 views
6

swift 3では、メソッドが "enumerateObjects"のあいまいな使用を示しています。どうすればいいですか?swift 3、PHFetchResult.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 
} 
} 

答えて

3

このnohのようなことをしてください。 PHFetchResultの拡張子は、汎用パラメータPHFetchResult<ObjectType>として他のObjectTypeがあるため、直接追加することはできません。だからあなたは何か他のことをしなければならない。

class FetchPhoto { 

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

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

     return list 
    } 
} 

PHAssetCollection.fetchMoments戻り、ここでPHFetchResult<PHAssetCollection>PHAssetCollectionPHFetchResultためObjectTypeです。 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 
    } 
} 

スウィフト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 
      }) 

     } 
    } 
+0

なぜfun(enumerationOptions.concurrent)のトレイルに追加 – six

+0

私はこれを動作させることができません。エニュメレーションオプションを追加しようとすると、「引数ラベル」(_:、_ :)は使用可能なオーバーロードと一致しませんでしたが、オプションを削除しても、あいまいなものとして表示されます。 –

12

スウィフト3.0:中括弧は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 
    } 
} 
+0

これを試してみました。理由を説明してもらえますか? – treyhakanson

+0

これはすごくうまくいきますが、PHFetchResultはObjective-CでNSFastEnumerationを採用しなければならないが、それでもSwiftでは 'for ... in'を使用できないというのはばかげている。 – matt

+0

ありがとう、あなたは私に多くの時間を節約しました。 – Flar