【发布时间】:2018-04-17 15:49:52
【问题描述】:
我正在尝试使用 swift 泛型,但我被卡住了...
这样做可能是不可能的,但我希望有人能提出一个好的建议。
所以我有这个协议和一个我想要内部的类型:
internal protocol ATCoreInstrumentProtocol { // SOME STUFF }
internal typealias AT_1G_WaveInstrumentType = //Somethings that conforms to ATCoreInstrumentProtocol
然后我就有了我想要公开的 InstrumentType。
这里的问题是ASSOCIATED_INSTRUMENT又名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")
【问题讨论】:
-
如果不知道
ATCoreInstrumentProtocol,不同模块中的类型如何实现InstrumentType? -
@zneak 他们不打算实现它,但他们应该像这样使用它:
let interactor = ATSyncInteractor<InstrumentTypes.AT_1G_Wave>(withSerial: "12345") -
ATCoreInstrumentProtocol也有关联类型吗? -
@zneak 不,没有。
-
ATCoreInteractor上的泛型参数在函数签名中有很大的意义吗?例如,您是否有仅接受ATSyncInteractor<InstrumentTypes.AT_1G_Wave>而不是ATSyncIterator<IT>(其中IT是泛型)的函数?
标签: ios swift generics swift-protocols associated-types