2016-06-20 6 views
6

스위프트 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에 대한 확장자를 직접 추가 할 수 없습니다. 다른 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 
    } 
} 

PHAssetCollection.fetchMoments 반환 여기 PHAssetCollectionPHFetchResult<PHAssetCollection>PHFetchResult에 대한 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

재미 – six

+0

의 흔적 (EnumerationOptions.concurrent)를 추가 내가 왜이 작업을 얻을 수 없습니다. 열거 옵션을 추가하려고하면 "Argument labels '(_ :, _ :)은 사용 가능한 오버로드와 일치하지 않지만 옵션을 제거하면 여전히 모호한 용도로 표시됩니다. –

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

이 모든 것이 매우 좋지만, Objective-C에서 PHFetchResult가 NSFastEnumeration을 채택해야하지만 우린 Swift에서 for ... in을 사용할 수 없다는 것은 우스운 일입니다. – matt

+0

감사합니다. 방금 많은 시간을 절약했습니다. – Flar