【问题标题】:Class-Only Protocols in SwiftSwift 中的纯类协议
【发布时间】:2016-07-08 15:41:19
【问题描述】:

我希望我的一些课程(不是全部)使用来自文档的'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

我不确定我是否完全按照文档中的说明进行操作。有人对此有任何想法吗?

【问题讨论】:

    标签: ios swift swift2 protocols


    【解决方案1】:

    Swift 4 允许您组合类型,因此您可以拥有自己的协议,然后创建例如类型别名以将其与特定的类要求组合。

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

    typealias PresentableVC = UIViewController & Presentable
    

    对于呈现的代码:

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

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

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

    【讨论】:

    • 根据这个protocol SomeClassOnlyProtocol: class, SomeInheritedProtocolSomeInheritedProtocol 后面的class,是什么意思?我认为这是一个类的地方 hoder(es)
    • 该协议扩展的一些其他协议
    • 我们不能在swift中扩展非名义类型
    【解决方案2】:

    ChrisWain 提供的答案是正确的。我只是在这里添加更多细节。

    定义协议

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

    protocol RefreshData: class {
        func updateController()
    }
    

    定义一个类

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

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

    符合你不拥有的课程

    有时您想让一个类符合协议,但您不拥有该类的源代码。在这种情况下,您可以使用extension

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

    【讨论】:

    • protocol RefreshData: class:这个表达式意味着这个协议只适用于类,而不是枚举或结构!?
    • @brahimm 完全正确
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      protocol RefreshData : class
      {
          func updateController()
      }
      
      class ClassA : RefreshData
      {
          func updateController() {}
      }
      
      class ClassB : RefreshData
      {
          func updateController() {}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多