Я пытаюсь работать с быстрыми дженериками, но я застрял...
Возможно, это невозможно сделать таким образом, но я надеялся, что у кого-нибудь будет хорошее предложение.
Итак, у меня есть этот протокол и тип, который я хочу иметь внутренним:
internal protocol ATCoreInstrumentProtocol { // SOME STUFF }
internal typealias AT_1G_WaveInstrumentType = //Somethings that conforms to ATCoreInstrumentProtocol
Затем у меня есть этот InstrumentType, который я хочу сделать общедоступным. Проблема здесь в том, что ASSOCIATED_INSTRUMENT
aka ATCoreInstrumentProtocol
должен быть internal
, и поэтому я не могу использовать его таким образом. Нет возможности сделать ATCoreInstrumentProtocol
общедоступным.
public protocol InstrumentType {
static var instrumentType: SupportedInstrumentTypes { get }
associatedtype ASSOCIATED_INSTRUMENT: ATCoreInstrumentProtocol
}
public final class InstrumentTypes {
private init() {}
public final class AT_1G_Wave : InstrumentType {
public class var instrumentType: SupportedInstrumentTypes { get { return .wave_1G } }
public typealias ASSOCIATED_INSTRUMENT = AT_1G_WaveInstrumentType
}
}
Вот как я хочу его использовать.
internal class ATCoreInteractor<IT: InstrumentType> {
internal var instrumentObservable : Observable<IT.ASSOCIATED_INSTRUMENT> {
return self.instrumentSubject.asObservable()
}
private var instrumentSubject = ReplaySubject<IT.ASSOCIATED_INSTRUMENT>.create(bufferSize: 1)
internal init(withSerial serial: String){
self.scanDisposable = manager
.scanFor([IT.instrumentType])
.get(withSerial: serial)
.take(1)
.do(onNext: { (inst) in
self.instrumentSubject.onNext(inst)
})
.subscribe()
}
И затем у меня есть ATSyncInteractor
, который является public
public final class ATSyncInteractor<IT : InstrumentType> : ATCoreInteractor<IT> {
public override init(withSerial serial: String) {
super.init(withSerial: serial)
}
}
public extension ATSyncInteractor where IT : InstrumentTypes.AT_1G_Wave {
public func sync(opPriority: BLEOperationPriority = .normal, from: Date, to: Date, callback: @escaping (ATCoreReadyData<AT_1G_Wave_CurrentValues>?, [WaveTimeSeriesCoordinator], Error?) -> Void) {
// DO SOMETHING
}
}
let interactor = ATSyncInteractor<InstrumentTypes.AT_1G_Wave>(withSerial: "12345")
InstrumentType
, если он не может знать оATCoreInstrumentProtocol
? - person zneak   schedule 17.04.2018let interactor = ATSyncInteractor<InstrumentTypes.AT_1G_Wave>(withSerial: "12345")
- person Aleksander Aleksic   schedule 17.04.2018ATCoreInstrumentProtocol
связанные типы? - person zneak   schedule 17.04.2018ATCoreInteractor
большое значение в сигнатурах функций? Например, есть ли у вас функции, которые только принимаютATSyncInteractor<InstrumentTypes.AT_1G_Wave>
вместоATSyncIterator<IT>
, гдеIT
является общим? - person zneak   schedule 17.04.2018ATCoreInteractor
. У вас может бытьpublic enum
, в котором перечисленыInstrumentType
и который может создавать конкретное значение каждогоASSOCIATED_INSTRUMENT
. - person zneak   schedule 17.04.2018public sync(...)
. Позже в этом году мы добавимAT_2G_Wave
иAT_Wave_Plus
InstrumentType, все они могут/будут иметь разные реализацииsync(...)
. - person Aleksander Aleksic   schedule 17.04.2018ATPairingInteractor<IT: InstrumentType>
,ATFirmwareInteractor<IT: InstrumentType>
,ATSettingsInteractor<IT: InstrumentType>
и так далее. Они также будут иметь разные реализации. - person Aleksander Aleksic   schedule 17.04.2018