Swift中的纯类协议

ton*_*ran 30 protocols ios conform swift swift2

我希望我的一些课程(不是全部)能够使用docs中的"Class-Only Protocols".我在做什么

protocol RefreshData: class, ClassA, ClassB
{
    func updateController()
}
Run Code Online (Sandbox Code Playgroud)

我收到了错误

non class type 'RefreshData cannot inherit from classA
non class type 'RefreshData cannot inherit from classB
Run Code Online (Sandbox Code Playgroud)

我不确定我是否完全遵循文档.有没有人对此有任何想法?

Wai*_*ain 39

Swift 4允许您组合类型,因此您可以拥有协议,然后创建一个类型别名,以将其与特定的类要求相结合.

对于(一个人为的)例子:

typealias PresentableVC = UIViewController & Presentable
Run Code Online (Sandbox Code Playgroud)

对于提供的代码:

问题是你试图限制特定的类,Swift不能这样做(目前无论如何).您只能限制类并从其他协议继承.您的语法是用于协议继承,但您尝试将其用作类限制.

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

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

  • 该协议扩展的其他一些协议 (2认同)

Luc*_*tti 22

ChrisWain提供的答案是正确的.我只是在这里添加一些细节.

定义协议

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

protocol RefreshData: class {
    func updateController()
}
Run Code Online (Sandbox Code Playgroud)

定义一个类

......从符合你的班级到协议的概念

class ClassA: RefreshData {
    func updateController() {

    }
}
Run Code Online (Sandbox Code Playgroud)

符合您不拥有的课程

有时您希望将类与协议相符,但您不拥有该类的源代码.在这种情况下,您可以使用extension

extension ClassB: RefreshData {
    func updateController() {

    }
}
Run Code Online (Sandbox Code Playgroud)

  • `protocol RefreshData:class`:dose这个表达式意味着这个协议只适用于类,不是枚举或结构! (3认同)
  • @brahimm完全正确 (3认同)

AMT*_*rky 9

最新版本的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
        }
}
Run Code Online (Sandbox Code Playgroud)