2016-06-20 43 views
6

3. adımda, yöntem bana "enumerateObjects 'in belirsiz kullanımı" nı gösterir. Ne yapabilirim?swift 3, PHFetchResult.enumerateObjects hatası

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

cevap

3

Bu gibi bir şey yapın. PHFetchResult için uzantıyı doğrudan ekleyemezsiniz, çünkü başka bir ObjectType öğesi, jenerik parametresi PHFetchResult<ObjectType>'dur. Yani başka bir şey yapmalısın.

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 döner burada PHAssetCollectionPHFetchResult<PHAssetCollection>PHFetchResult için ObjectType olduğunu. ObjectType'ı belirtmediğiniz için belirsiz hatayı aldınız.

Buna yaklaşmanın genel bir yolu.

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

eğlenceli – six

+0

izi için (EnumerationOptions.concurrent) ekleyin neden bu işe alınamıyor. Numaralandırma seçenekleri eklemeye çalıştığımda "Bağımsız etiketler" (_:, _ :) herhangi bir aşırı yüklenmeyle eşleşmiyor) alıyorum ama seçenekleri kaldırdığımda hala belirsiz kullanım olarak gösteriliyor .. –

12

Swift 3.0: Kıvırcık konsollar enumerateObjects sonra başlamadan önce sadece Yuvarlak Konsollar ekleyin.

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

Sadece bunu denedim ve işe yaradı; nedenini açıklar mısınız? – treyhakanson

+0

Hiçbir şey yapmaması gereken bir değişiklik gibi görünüyor Bu çok iyi, ama PHFetchResult Objective-C NSFastEnumeration benimsemeli ve yine de '' in 'ile kullanmak için Swift kullanamazsınız saçma. – matt

+0

Teşekkürler, sadece bana çok zaman kazandırdın. – Flar