在Swift中的仅类协议

33

我想让我的一些类(而不是所有类)遵循“仅类协议”。 我正在做的是

protocol RefreshData: class, ClassA, ClassB
{
    func updateController()
}

我遇到了错误

non class type 'RefreshData cannot inherit from classA
non class type 'RefreshData cannot inherit from classB

我不确定我是否完全按照文档的要求操作。有人对此有什么想法吗?

4个回答

41

Swift 4允许您组合类型,因此您可以拥有自己的协议,然后创建一个类型别名,将其与特定的类需求结合起来。

例如(一个牵强的例子):

typealias PresentableVC = UIViewController & Presentable

针对所呈现的代码:

问题在于你试图限制特定的类,但是 Swift 目前无法做到。你只能限制为某些类或从其他协议继承。你的语法是用于协议继承,但你正在尝试将其用作类限制。

请注意,类协议的目的是:

当由该协议要求定义的行为假定或需要符合类型具有引用语义而不是值语义时,请使用仅限类协议。


1
根据这个 protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol,在 class, 之后的 SomeInheritedProtocol 是什么意思?我认为它是类的占位符。 - tonytran
2
这个协议扩展了一些其他的协议。 - Wain
我们无法在Swift中扩展非名义类型。 - Roman Filippov

28
< p > ChrisWain提供的答案是正确的。我在这里只是添加了一些细节。

定义协议

您必须区分声明一个协议(可用于类)的概念。

protocol RefreshData: class {
    func updateController()
}

定义一个类

...从将你的类符合协议的概念开始

class ClassA: RefreshData {
    func updateController() {

    }
}

使不属于你拥有的类符合特定协议

有时候,你想让一个类符合某个协议,但你没有这个类的源代码。这种情况下,你可以使用扩展extension

extension ClassB: RefreshData {
    func updateController() {

    }
}

4
这个表达式的意思是这个协议只能被类(class)遵循,不能被枚举(enum)或结构体(struct)遵循。 - Siempay
5
@brahimm 确切地说 - Luca Angeletti

10

最新版本的Swift能够实现这一功能!我会创建一个协议和协议扩展,以定向作用于你想要的类!(将扩展限制为特定的类)

    protocol Movable {
        func moveForward()
        func moveBackward()
    }

    extension Movable where Self: Car {
        func moveForward() {
            self.location.x += 10;
        }

        func moveBackward() {
            self.location.x -= 10;
        }
    }
    extension Movable where Self: Bike {
        func moveForward() {
            self.x += 1;
        }

        func moveBackward() {
            self.x -= 1;
        }
    }

    class Car: Movable {
        var location: CGPoint

        init(atLocation location: CGPoint) {
            self.location = location
        }
    }

    class Bike: Movable {
        var x: Int

        init(atX x: Int) {
            self.x = x
        }
}

3
protocol RefreshData : class
{
    func updateController()
}

class ClassA : RefreshData
{
    func updateController() {}
}

class ClassB : RefreshData
{
    func updateController() {}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接