首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >类型别名的重新声明无效

类型别名的重新声明无效
EN

Stack Overflow用户
提问于 2018-05-31 08:04:55
回答 1查看 460关注 0票数 0

我有一个泛型协议TwoWayBindDelegate,它使用泛型关联类型来确定函数twoWayBind()的参数

代码语言:javascript
复制
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',因为我在我的两个扩展中都声明了BindTypetwoWayBind()。有没有办法让这两个扩展都为TwoWayBindDelegate提供不同的实现

代码语言:javascript
复制
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。是否碰巧有解决办法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-31 08:43:03

我不太明白typealias是做什么用的。仅函数声明就足以告诉编译器BindType必须是什么。

我在您的代码中发现的问题(当然,除了缺少Observable声明之外)是Reactive类本身不符合TwoWayBindDelegate。为了解决这个问题,我抛出了一个任意的twoWayBind实现。当我这样做时,当我删除了不必要的typealias声明时,您的代码就会为我编译:

代码语言:javascript
复制
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) -> ())?) {
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50614905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档