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()
}
但是有两个问题,
在第一种方法中,如果我在协议中放置一个 init 方法,它不允许我在第一种方法中像 -> People
那样放置一个 return 语句。
在第二种方法中,我必须在协议扩展中提供一个函数体,所以这个东西是没有问题的,因为我不知道具体的类型 return对于此一般实施。
所以关于如何调用 init 方法和执行以下任一操作的任何建议:
- 让协议(不是协议扩展)仅由特定的 classe 及其子类实现。
- 或者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
{}
这很容易被想要绕过的程序员绕过,但至少它会让编译器在您尝试将协议应用于其他 类.
时警告您
我想创建一个仅被特定 class 及其在 swift 中的子类采用的协议。 我知道我可以使用这样的协议扩展
protocol PeopleProtocol: class {
}
extension PeopleProtocol where Self: People {
}
但是我的协议中的方法将是 init
方法,它将由 class 或其子类实现,并且 return 仅某些特定类型的对象.
类似这样的事情。
protocol PeopleProtocol: class {
init() -> People
}
或者我可以做这样的事情
extension PeopleProtocol where Self : People {
init()
}
但是有两个问题,
在第一种方法中,如果我在协议中放置一个 init 方法,它不允许我在第一种方法中像
-> People
那样放置一个 return 语句。在第二种方法中,我必须在协议扩展中提供一个函数体,所以这个东西是没有问题的,因为我不知道具体的类型 return对于此一般实施。
所以关于如何调用 init 方法和执行以下任一操作的任何建议:
- 让协议(不是协议扩展)仅由特定的 classe 及其子类实现。
- 或者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
{}
这很容易被想要绕过的程序员绕过,但至少它会让编译器在您尝试将协议应用于其他 类.
时警告您