Mad*_*adu 3 protocols swift protocol-extension
我想创建一个只被特定类及其子类迅速采用的协议。我知道我可以使用这样的协议扩展
protocol PeopleProtocol: class {
}
extension PeopleProtocol where Self: People {
}
Run Code Online (Sandbox Code Playgroud)
但是,将在我的协议中使用的init方法将是将由类或其子类实现的方法,并且仅返回某些特定类型的对象。
这样的事情。
protocol PeopleProtocol: class {
init() -> People
}
Run Code Online (Sandbox Code Playgroud)
或者我可以做这样的事情
extension PeopleProtocol where Self : People {
init()
}
Run Code Online (Sandbox Code Playgroud)
但是有两个问题,
在第一种方法中,如果我将init方法放在协议中,则不允许像-> People在第一种方法中那样在其中放置return语句。
在第二种方法中,我必须在协议扩展中提供一个函数主体,因此这件事毫无疑问,因为我不知道该通用实现返回哪种特定类型。
因此,任何建议如何调用init方法并执行以下任一操作:
您可以添加仅扩展适当类的必需方法。
例如:
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
{}
Run Code Online (Sandbox Code Playgroud)
想要这样做的程序员可以很容易地避免这种情况,但是,如果您尝试将协议应用于其他类,至少它会让编译器警告您。