gpt4 book ai didi

swift - 在基类中实现 Swift 协议(protocol)方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:34:18 24 4
gpt4 key购买 nike

我有一个 Swift 协议(protocol),它定义了如下方法:

protocol MyProtocol {

class func retrieve(id:String) -> Self?
}

我有几个不同的类将符合这个协议(protocol):

class MyClass1 : MyProtocol { ... }
class MyClass2 : MyProtocol { ... }
class MyClass3 : MyProtocol { ... }

每个子类中retrieve 方法的实现几乎相同。我想将这些函数的通用实现拉入符合协议(protocol)的共享父类(super class)中:

class MyBaseClass : MyProtocol
{
class func retrieve(id:String) -> MyBaseClass?
}

class MyClass1 : MyBaseClass { ... }
class MyClass2 : MyBaseClass { ... }
class MyClass3 : MyBaseClass { ... }

这种方法的问题在于我的协议(protocol)将retrieve 方法的返回类型定义为Self 类型,这是我最终真正想要的。但是,结果我无法以这种方式在基类中实现 retrieve,因为它会导致 MyClass1MyClass2 的编译器错误我的类 3。这些类中的每一个都必须符合它们从 MyBaseClass 继承的协议(protocol)。但是因为该方法是用 MyBaseClass 的返回类型实现的,并且协议(protocol)要求它是 MyClass1,所以它说我的类不符合协议(protocol)。

我想知道是否有一种干净的方法来实现一个协议(protocol)方法,该方法在基类中的一个或多个方法中引用 Self 类型。我当然可以在基类中实现一个不同名称的方法,然后让每个子类通过调用其父类(super class)的方法来实现协议(protocol)来完成工作,但这对我来说似乎不是特别优雅。

我在这里缺少更直接的方法吗?

最佳答案

这应该有效:

protocol MyProtocol {
class func retrieve(id:String) -> Self?
}

class MyBaseClass: MyProtocol {

required init() { }

class func retrieve(id:String) -> Self? {
return self()
}
}

required init() { } 是确保派生自 MyBaseClass 的任何子类具有 init() 初始化程序所必需的。

请注意,此代码会使 Swift Playground 崩溃。我不知道为什么。所以尝试使用真实的项目。

关于swift - 在基类中实现 Swift 协议(protocol)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27008934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com