Swift 更改方法的协议返回类型

Swift 更改方法的协议返回类型,swift,polymorphism,protocols,Swift,Polymorphism,Protocols,我的协议“模型”和符合“模型”的类“设备”有点问题 在我的协议中,我有一个返回值为“Model”的函数。在我的类中,我有这个实现函数,希望将返回类型从“Model”更改为“Device”。但是如果我改变这个,我必须再次添加原始函数 我的模型协议: protocol Model { func fromJSON(jsonString : String) -> Model } 我的设备类别: class Device : Model { func fromJSON(jsonSt

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

我的模型协议:

protocol Model {
    func fromJSON(jsonString : String) -> Model
}
我的设备类别:

class Device : Model {
    func fromJSON(jsonString: String) -> Model {
        var jsonObj = JSON(jsonString)
        var device = Device()
        return device
    }
}
当我尝试将此函数的结果分配给设备变量时,会收到以下错误消息:

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


您的
模型
协议承诺:

func fromJSON(jsonString : String) -> 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) {
        ...
    }
}

谢谢你的回答。现在我有另一个问题。现在我的子类中的函数有一个错误:非最终类“Device”中的方法“fromJSON”必须返回“SELF”以符合协议“Model”对不起;对理想情况下,您应该将类标记为final,但是如果您计划将其作为子类,那么您应该在那里返回Self。如果可能,请使用结构而不是类。他们没有这些并发症。非常感谢。我想将类型从class更改为struct。但是现在我遇到了一个来自不同类的函数的问题。该函数被称为toJsonString(objectanyobject)。我使用classobject.toJsonString(self)在设备结构中调用这个函数。但在从类更改为结构后,我得到了以下错误:无法使用类型为(Device)的参数列表调用“toJsonString”。知道吗?结构不是任何对象。这是一个Any(尽管通常情况下,您应该将
toJSONString
设置为对象上的一个方法,而不是将对象传递给的函数)。感谢您的帮助。已关闭:)
protocol Model {
    init(jsonString : String)
}

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