2016-09-29 2 views
15

У меня этот код работает отлично в Swift 2.СВИФТ 3,0 миграции ошибка - расширение общего класса Obj-C не может получить доступ к классу общий параметр во время выполнения

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

Поскольку я повышен до Swift 3

Расширения общего класса Objective-C не может получить доступ к непатентованным параметрам класса во время выполнения

Я не имею ни малейшего представления о том, как это исправить. Любая помощь высоко ценится!

ответ

-1

Невозможно исправить это, вам может потребоваться реорганизовать ваш код или использовать другие методы.

вы можете обратиться к этому:

How to use a swift class with a generic type in objective c

документы:

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

1

Проблема была сообщенные здесь: https://bugs.swift.org/browse/SR-1576

Но в конце концов, вы не можете использовать for in с PHFetchResult в Swift 3.0. Давайте рассмотрим несколько примеров:

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

вытягивать из Realm, вы можете обойти эту проблему, расширяя подкласс, что вы хотите, чтобы соответствовать последовательности и поставить функцию 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