我有一个泛型协议TwoWayBindDelegate
,它使用泛型关联类型来确定函数twoWayBind()
的参数
protocol TwoWayBindDelegate: class {
associatedtype BindType
func twoWayBind(to observable: Observable<BindType>?, observableChanged: ((BindType) -> ())?)
}
然后,我创建了一个类Reactive<Base: UIView, Type>
(它符合TwoWayBindDelegate
),在这个类中,您必须使用泛型Base
对其进行初始化。例如:let reactiveSlider = Reacive<UISlider>(slider)
。
我的问题是当我扩展Reactive和符合TwoWayBindDelegate
时,我得到了一个错误的Invalid redeclaration of 'BindType'
,因为我在我的两个扩展中都声明了BindType
和twoWayBind()
。有没有办法让这两个扩展都为TwoWayBindDelegate
提供不同的实现
class Reactive<Base: UIView>: TwoWayBindDelegate {
public var base: Base
init(base: Base) {
self.base = base
}
}
extension Reactive where Base == UISlider {
typealias BindType = Float
func twoWayBind(to observable: Observable<Float>?, observableChanged: ((Float) -> ())?) {
// implement two way bind for UISlider
}
}
extension Reactive where Base == UITextField {
typealias BindType = String
func twoWayBind(to observable: Observable<String>?, observableChanged: ((String) -> ())?) {
// implement two way bind for UITextField
}
}
我做了一些研究,发现它可能是一个错误的https://bugs.swift.org/browse/SR-5392。是否碰巧有解决办法?
发布于 2018-05-31 08:43:03
我不太明白typealias
是做什么用的。仅函数声明就足以告诉编译器BindType
必须是什么。
我在您的代码中发现的问题(当然,除了缺少Observable声明之外)是Reactive类本身不符合TwoWayBindDelegate。为了解决这个问题,我抛出了一个任意的twoWayBind
实现。当我这样做时,当我删除了不必要的typealias
声明时,您的代码就会为我编译:
struct Observable<T> {}
protocol TwoWayBindDelegate: class {
associatedtype BindType
func twoWayBind(to observable: Observable<BindType>?, observableChanged: ((BindType) -> ())?)
}
class Reactive<Base: UIView>: TwoWayBindDelegate {
public var base: Base
init(base: Base) {
self.base = base
}
func twoWayBind(to observable: Observable<Int>?, observableChanged: ((Int) -> ())?) {
}
}
extension Reactive where Base == UISlider {
func twoWayBind(to observable: Observable<Float>?, observableChanged: ((Float) -> ())?) {
}
}
extension Reactive where Base == UITextField {
func twoWayBind(to observable: Observable<String>?, observableChanged: ((String) -> ())?) {
}
}
https://stackoverflow.com/questions/50614905
复制相似问题