【问题标题】:Change protocol return type for method更改方法的协议返回类型
【发布时间】:2015-06-18 16:04:40
【问题描述】:

我的协议“模型”和符合“模型”的类“设备”有一点问题。 在我的协议中,我有一个返回值“模型”的函数。在我的课堂上,我有这个实现函数,并且想将返回类型从“模型”更改为“设备”。但是如果我改变这个,我必须重新添加原来的功能。

我的模型协议:

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

我的设备类:

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

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

无法将“模型”类型的值分配给“设备”类型的值

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

【问题讨论】:

    标签: swift polymorphism protocols


    【解决方案1】:

    您的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) {
            ...
        }
    }
    

    【讨论】:

    • 感谢您的回答。现在我有另一个问题。现在我的子类中的函数出现错误:非最终类“Device”中的方法“fromJSON”必须返回“SELF”以符合协议“Model”
    • 对不起;是的。理想情况下,您应该将类​​标记为 final,但如果您打算子类化,那么您应该在那里返回 Self。如果可能,请使用结构而不是类。他们没有这些并发症。
    • 好的。谢谢你。我想将类型从类更改为结构。但是现在我遇到了来自不同类的函数的问题。该函数被称为 toJsonString(object AnyObject)。我用 classobject.toJsonString(self) 在 Device Struct 中调用这个函数。但是从类更改为结构后,我收到此错误:无法使用类型(设备)的参数列表调用“toJsonString”。有什么想法吗?
    • 结构不是 AnyObject。它是 Any(尽管通常,您应该使 toJSONString 成为对象上的方法,而不是您将对象传递给的函数)。
    • 感谢您的帮助。关闭:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2021-11-16
    • 2011-11-09
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多