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