2016-09-29 9 views
15

時にクラスの一般的なパラメータにアクセスすることはできません私はスウィフト3SWIFT 3.0のマイグレーション・エラー - ジェネリックのObj-Cのクラスの拡張が実行

にアップグレード以来、私はスウィフト2.

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

にこのコードは正常に動作してい一般的なObjective-Cのクラスの

拡張は、私はこの問題を解決する方法については考えているランタイム

でクラスの汎用パラメータにアクセスすることはできません。どんな助けでも大歓迎です!

答えて

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] 
    // ... 
} 
0

バグレポートにはsuggested by Swift engineer 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) 
    } 
} 
1

、あなたはシーケンスに適合し、そこmakeIerator機能を入れて欲しいもののサブクラスを拡張することによってこの問題を回避できる可能性があります。あなたはhttps://github.com/realm/realm-cocoa/blob/master/Realm/Swift/RLMSupport.swift

で完全なコードを見ることができます

// Sequence conformance for ClassA is provided by ProtocolX's `makeIterator()` implementation. 
extension ClassA: Sequence {} 

extension ProtocolX { 
    // Support Sequence-style enumeration 
    public func makeIterator() -> RLMIterator { 
     return RLMIterator(collection: self) 
    } 
} 

関連する問題