如何在协议上创建约束

时间:2017-02-08 18:05:07

标签: ios swift swift-protocols

我尝试创建协议,该协议只能由继承自UIView的类实现,当这段代码编译没有错误时(在Swift 3.0中)我感到惊讶:

protocol TestsProtocol {
    func test()
}

extension TestsProtocol where Self: UIView { }

class FooClass: TestsProtocol {

    func test() {

    }
}

我们可以看到FooClass没有从UIView继承,使用协议扩展我不想强制只有从UIView继承的类才能实现它。 据我记得,这不会在Swift 2.1中编译

2 个答案:

答案 0 :(得分:2)

你不能在Swift中这样做。扩展语法还有其他功能:

extension TestsProtocol where Self: UIView {
    func useful() {
        // do something useful
    }
}

现在任何实现TestsProtocol并且是UIView(或子类)的类也都有有用的()函数。

答案 1 :(得分:0)

您可以通过限制协议轻松地做到这一点,因为它可以扩展到UIView以外的任何类型:

protocol TestsProtocol:UIView {
    func test()
}

class FooClass: TestsProtocol {

    func test() {

    }
}

所以这会导致编译错误

“ TestsProtocol”要求“ FooClass”从“ UIView”继承