我搜索,如何只用一个函数返回多种类型。
型号:
//MARK: - MODEL -
class ModelA: NSObject, Model{
var name: String
init(name: String) {
self.name = name
super.init()
}
func build()-> ModelA{
return self
}
}
class ModelB: NSObject, Model{
var pseudo: String
init(pseudo: String) {
self.pseudo = pseudo
super.init()
}
func build()-> ModelB{
return self
}
}
我的协议:
protocol Model{
associatedtype T
func build()-> T
}
和我的枚举:
enum Api{
case a
case b
func request()->Model{
switch self {
case .a: return ModelA(name: "Test")
case .b: return ModelB(pseudo: "Ok")
}
}
}
但是当我建立时,我有这个错误:
游乐场执行失败:错误:MyPlayground.playground:52:21:错误:协议'模型'只能用作通用约束,因为它具有自我或相关类型要求
func request() - >模型{
答案 0 :(得分:1)
基于此answer,您必须使用具有关联类型的协议作为通用约束。
func request<T: Model>() -> T {
switch self {
case .a:
return ModelA(name: "") as! T
case .b:
return ModelB(pseudo: "") as! T
}
}
答案 1 :(得分:1)
这正是Self
的用途(而不是使用显式关联类型):
protocol Model{
func build() -> Self
}
class ModelA: NSObject, Model{
var name: String
init(name: String) {
self.name = name
super.init()
}
func build() -> Self {
return self
}
}