我想创建一个仅由特定类及其子类在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方法并执行:
答案 0 :(得分:5)
您可以添加一个只为相应类扩展的必需方法。
例如:
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
{}
这可能很容易被想要的程序员所规避,但至少如果你试图将协议应用于其他类,它会让编译器发出警告。