仅使用一个函数返回多种类型

时间:2017-05-19 09:36:24

标签: swift

我搜索,如何只用一个函数返回多种类型。

型号

//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() - >模型{

2 个答案:

答案 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
    }
}