#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)
это, так как это избавит вас от необходимости перебирать объекты