Сделайте расширение общего класса Objective-C

#swift #objective-c #generics #realm

Вопрос:

Как ссылаться на универсальный код в расширении ObjC? Следующий код содержит

 Extension of a generic Objective-C class cannot access the class's generic parameters at runtime
 

этот код должен быть преобразован RLMResults<T> в [T]

 extension RLMResults {

    @objc func toArray<RLMObjectType>() -> [RLMObjectType] {
        var array = [RLMObjectType]()
        for result in self {
            array.append(result)
        }
        return array
    }

}
 

Определение RLMResult в ObjC

 @interface RLMResults<RLMObjectType> : NSObject<RLMCollection, NSFastEnumeration>
 

Комментарии:

1. Почему вам нужно это делать? Не можете ли вы просто использовать быструю версию Realm, где у вас есть Results<T> тип, который вы можете просто преобразовать в массив с помощью Array(someResults) ?

2. Это существующее приложение, которое использует область ObjC

3. Как следует из ошибки, Swift не знает о дженериках Objective-C, поэтому лучшее, что вы можете сделать, — это вернуться [Any] . Однако вы можете привести их к правильному типу у вызывающего абонента. Если вам это не нравится, переключитесь на RealmSwift. Я не вижу ничего особенного в существующем приложении, которое мешает вам это делать. Вам не нужно менять свой старый код.

4. Вы уверены, что хотите добавить объекты области обновления в реальном времени в массив? Они больше не будут доступны для наблюдения и больше не будут обновляться в реальном времени. Не менее важно, что это также делает их более не загруженными лениво и может потреблять большой объем памяти с большим набором данных (вызывая сбой).

5. О, и если вы хотите преобразовать объекты области в массив, вы можете просто сделать let myArray = Array(realmResults) это, так как это избавит вас от необходимости перебирать объекты