swift2 Swift中的类专用协议

bwntbbo3  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(232)

我希望我的一些类(不是全部)使用docs中的'Class-Only Protocols'来保持一致。

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

我得到的错误

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

我不确定我是不是完全按照文件上说的去做。有人对此有什么想法吗?

wixjitnu

wixjitnu1#

Swift 4允许您合并类型,因此您可以拥有自己的协议,然后创建,例如,一个类型别名,将其与特定的类需求组合在一起。
举个(人为的)例子:

typealias PresentableVC = UIViewController & Presentable

对于提供的代码:
问题是你试图限制到特定的类,而Swift不能这样做(至少目前是这样)。你只能限制到类,并从其他协议继承。你的语法是用于协议继承的,但你试图将其用作类限制。
请注意,类协议的用途是:
当通信协定需求所定义的行为假设或要求相容型别具有指涉语意(Semantics)而非值语意时,请使用仅限类别的通信协定。

e0bqpujr

e0bqpujr2#

  • Chris* 和 Wain 提供的答案是正确的。我只是在这里补充一些细节。

定义协议

必须区分声明protocol的概念(可用于类)

protocol RefreshData: class {
    func updateController()
}

定义类

...从使类符合协议的概念

class ClassA: RefreshData {
    func updateController() {

    }
}

符合您不拥有的类

有时候你想让一个类符合一个协议,但是你并不拥有这个类的源代码。

extension ClassB: RefreshData {
    func updateController() {

    }
}
ctrmrzij

ctrmrzij3#

最新版本的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
        }
}
bqucvtff

bqucvtff4#

protocol RefreshData : class
{
    func updateController()
}

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

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

相关问题