2016-06-20 10 views
6

In swift 3, il metodo mi mostra "l'uso ambiguo di 'enumerateObjects'", cosa succede.come posso fare?swift 3, PHFetchResult.enumerateObjects error

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 
} 
} 

risposta

3

Fare qualcosa del genere no. Non è possibile aggiungere direttamente l'estensione per PHFetchResult perché ha un altro ObjectType come parametro generico PHFetchResult<ObjectType>. Quindi devi fare qualcos'altro.

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 rendimenti PHFetchResult<PHAssetCollection> qui PHAssetCollection è il ObjectType per il PHFetchResult. Hai ottenuto l'errore ambiguo perché non hai specificato objectType.

Un modo generico per avvicinarsi a questo.

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 
    } 
} 

Swift 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

Perché aggiungere (EnumerationOptions.concurrent) per percorso di divertimento – six

+0

non riesco a farlo funzionare. Quando provo ad aggiungere opzioni di enumerazione ottengo "etichette Argument" (_:, _ :) non corrispondono a nessun sovraccarico disponibile ", ma quando rimuovo le opzioni è ancora visualizzato come uso ambiguo .. –

12

Swift 3.0: Basta aggiungere il rotonde staffe prima graffe inizia dopo 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

Ho appena provato questo e ha funzionato; ti dispiacerebbe spiegare perché? Sembra una modifica che non dovrebbe fare nulla – treyhakanson

+0

Questo è tutto molto bene, ma è ridicolo che PHFetchResult debba adottare NSFastEnumeration in Objective-C e tuttavia non possiamo usare 'for ... in' con esso in Swift. – matt

+0

Grazie, mi hai appena salvato un sacco di tempo. – Flar