15

このコードは Swift 2 で正常に動作しています。

extension PHFetchResult: Sequence {
     public func makeIterator() -> NSFastEnumerationIterator {
         return NSFastEnumerationIterator(self)
     }
}

Swift3にアップグレードしてから

ジェネリック Objective-C クラスの拡張は、実行時にクラスのジェネリック パラメータにアクセスできません

これを修正する方法がわかりません。どんな助けでも大歓迎です!

4

4 に答える 4

1

ここで問題が報告されました: https://bugs.swift.org/browse/SR-1576

for inしかし結局、Swift 3.0 で PHFetchResult を使用することはできません。いくつかの例を見てみましょう:

let collections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: nil)
let collectionLists = PHCollectionList.fetchCollectionLists(with: .momentList, subtype: .momentListYear, options: nil)
let assets = PHAsset.fetchAssets(with: .image, options: nil)

PHFetchResult の組み込みの列挙を使用することもできます (私の推奨する解決策):

collections.enumerateObjects(_:) { (collection, count, stop) in
    //...
}
collectionLists.enumerateObjects(_:) { (collectionList, count, stop) in
    //...
}
assets.enumerateObjects(_:) { (asset, count, stop) in
    //...
}

または、インデックスで各オブジェクトにアクセスします。

for idx in 0 ..< collections.count {
    let collection = collections[idx]
    // ...
}
for idx in 0 ..< collectionLists.count {
    let collectionList = collectionLists[idx]
    // ...
}
for idx in 0 ..< assets.count {
    let asset = assets[idx]
    // ...
}
于 2016-12-02T17:46:08.353 に答える
0

Swift エンジニアの Jordan Roseがバグ レポートで提案したように、ラッパー タイプを使用できます。

import Photos

struct ResultSequence<Element: AnyObject>: Sequence {
  var result: PHFetchResult<Element>
  init(_ result: PHFetchResult<Element>) {
    self.result = result
  }
  func makeIterator() -> NSFastEnumerationIterator {
    return NSFastEnumerationIterator(self.result)
  }
}


func test(_ request: PHFetchResult<PHCollection>) {
  for elem in ResultSequence(request) {
    print(elem)
  }
}
于 2016-12-05T18:05:07.673 に答える