15

我的这段代码在 Swift 2 中运行良好。

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

自从我升级到 Swift 3

泛型 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 回答
1

从 Realm 中提取,您可以通过扩展您想要符合 Sequence 的子类并将makeIerator函数放在那里来解决这个问题。

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

你可以在https://github.com/realm/realm-cocoa/blob/master/Realm/Swift/RLMSupport.swift看到完整的代码

于 2017-04-25T18:44:14.673 回答
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 回答
-1

没有办法解决这个问题,您可能需要重构代码或使用其他一些技术。

你可以参考这个:

如何在objective c中使用具有泛型类型的swift类

文档:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_78

于 2016-11-18T12:16:05.680 回答