Swift 协议仅由特定 类 实施

Swift protocol to only implemented by specific classes

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

  protocol PeopleProtocol: class {
   }

   extension PeopleProtocol where Self: People {
   }

但是我的协议中的方法将是 init 方法,它将由 class 或其子类实现,并且 return 仅某些特定类型的对象.

类似这样的事情。

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

或者我可以做这样的事情

extension PeopleProtocol where Self : People {
   init()
}

但是有两个问题,

  1. 在第一种方法中,如果我在协议中放置一个 init 方法,它不允许我在第一种方法中像 -> People 那样放置一个 return 语句。

  2. 在第二种方法中,我必须在协议扩展中提供一个函数体,所以这个东西是没有问题的,因为我不知道具体的类型 return对于此一般实施。

所以关于如何调用 init 方法和执行以下任一操作的任何建议:

  1. 让协议(不是协议扩展)仅由特定的 classe 及其子类实现。
  2. 或者return某个来自协议扩展方法的实例,没有给出它的主体。

您可以添加一个只为适当 类 扩展的必需方法。

例如:

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
{}

这很容易被想要绕过的程序员绕过,但至少它会让编译器在您尝试将协议应用于其他 类.

时警告您