2016-06-20 15 views
6

W swift 3 metoda pokazuje mi "niejednoznaczne użycie" enumerateObjects "", co się stanie. Jak mogę to zrobić?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 
} 
} 

Odpowiedz

3

Zrób coś takiego jak to. Nie można bezpośrednio dodać rozszerzenia dla PHFetchResult, ponieważ ma on inny typ ObjectType jako ogólny parametr PHFetchResult<ObjectType>. Więc musisz zrobić coś innego.

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 powraca PHFetchResult<PHAssetCollection> tutaj PHAssetCollection jest ObjectType dla PHFetchResult. Masz niejednoznaczny błąd, ponieważ nie określono właściwości objectType.

Ogólny sposób podejścia do tego.

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

dlaczego dodawać (EnumerationOptions.concurrent) do szlaku zabawy – six

+0

Nie mogę tego uruchomić. Kiedy próbuję dodać opcje wyliczania, otrzymuję "etykiety argumentów" (_:, _ :) nie pasują do żadnych dostępnych przeciążeń ", ale kiedy usuwam opcje, to wciąż jest to niejednoznaczne użycie. –

12

Swift 3.0: Wystarczy dodać nawiasach okrągłych przed Curly Wsporniki rozpoczyna się po 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

Właśnie próbowałem tego i zadziałało; Czy mógłbyś wytłumaczyć dlaczego? Wygląda jak zmiana, która nie powinna nic robić. – treyhakanson

+0

To wszystko bardzo dobrze, ale to śmieszne, że PHFetchResult powinien przyjąć NSFastEnumeration w Objective-C, a jednak nie możemy użyć 'for ... in' z tym w Swift. – matt

+0

Dzięki, zaoszczędzisz mi bardzo dużo czasu. – Flar