首页 文章

Swift协议仅由特定类实现

提问于
浏览
3

我想创建一个仅由特定类及其子类在swift中采用的协议 . 我知道我可以使用这样的协议扩展

protocol PeopleProtocol: class {
   }

   extension PeopleProtocol where Self: People {
   }

但是我的协议中的方法将是一个 init 方法,它将由类或其subClasess实现,并且只返回某些特定类型的对象 .

这样的事情 .

protocol PeopleProtocol: class {
   init() -> People
}

或者我可以做这样的事情

extension PeopleProtocol where Self : People {
   init()
}

但是有两个问题,

  • 在第一种方法中,如果我在协议中放置一个init方法,它不允许我在第一种方法中放置一个返回语句,如 -> People .

  • 在第二种方法中,我必须在协议扩展中提供一个函数体,所以这件事是不可能的,因为我不知道为这个一般实现返回什么特定类型 .

所以任何建议我如何调用init方法并执行以下任一操作:

  • 让协议(不是协议扩展)仅由特定的classe及其子类实现 .

  • 或者从协议扩展方法返回某个实例而不给它的主体 .

1 回答

  • 4

    您可以添加仅为适当的类扩展的必需方法 .

    例如:

    protocol PeopleProtocol
    {
      var conformsToPeopleProtocol:Bool { get }
    }
    
    extension PeopleProtocol where Self:People
    {
      var conformsToPeopleProtocol:Bool {return true}
    }
    
    class People  
    {}
    
    class Neighbours:People 
    {}
    
    extension Neighbours:PeopleProtocol // this works 
    {}
    
    class Doctors:People,PeopleProtocol // this also works
    {}
    
    class Dogs:PeopleProtocol // this will not compile
    {}
    

    这可能很容易被想要的程序员所规避,但至少如果你试图将协议应用于其他类,它会让编译器发出警告 .

相关问题