更改方法的协议返回类型

时间:2015-06-18 16:04:40

标签: swift polymorphism protocols

我的协议“模型”和符合“模型”的类“设备”有点问题。 在我的协议中,我有一个函数,其返回值为“Model”。在我的课程中,我有这个实现功能,并希望将返回类型从“模型”更改为“设备”。但如果我改变这个,我必须再次添加原始功能。

我的模型协议:

protocol Model {
    func fromJSON(jsonString : String) -> Model
}

我的设备类:

class Device : Model {
    func fromJSON(jsonString: String) -> Model {
        var jsonObj = JSON(jsonString)
        var device = Device()
        return device
    }
}

当我尝试将此函数的结果分配给Device变量时,我收到此错误消息:

  

无法将“Model”类型的值分配给“Device”类型的值

let jsonString: String = "MY ARRAY";
var device2 = Device()
device2 = Device().fromJSON(jsonString)

1 个答案:

答案 0 :(得分:3)

您的Model协议作出承诺:

func fromJSON(jsonString : String) -> Model

它承诺返回一些 Model。它不承诺返回与实现者相同类型的Model。如果你的意思是,它被称为Self

protocol Model {
    func fromJSON(jsonString : String) -> Self
}

使用类,实现起来有点痛苦。理想情况下,您的设备应该是一个结构,这使它变得微不足道。但是如果你标记了类final,那么它也没关系:

protocol Model {
    static func fromJSON(jsonString : String) -> Self
}

final class Device : Model {
    class func fromJSON(jsonString: String) -> Device {
        let device = Device()
        return device
    }
}

但实际上,整个协议毫无意义。你真正想要的是一个初始化器:

protocol Model {
    init(jsonString : String)
}

class Device : Model {
    required init(jsonString: String) {
        ...
    }
}