在Swift中创建类集群(带工厂方法):"不能转换类型'子类的返回表达式?'返回类型' Self?'"

时间:2016-02-23 04:36:30

标签: swift swift-protocols

我有一个类集群 - 当我从JSON创建Class的实例时,我希望能够返回Class的子类。但是,我似乎无法使这些类型成功。

似乎Subclass的实例应该可以转换为Class。我这里不是Class类型Self吗?

帮助。

protocol JSONSerializable
{
    static func withJSONRepresentation( json:Any? ) -> Self?
}

class Class : JSONSerializable
{
    static func withJSONRepresentation( json:Any? ) -> Self?
    {
        return Subclass( jsonRepresentation: json )
    }
    init?( jsonRepresentation:Any? )
    {
        // init instance here
    }
}

class Subclass : Class
{
    override init?( jsonRepresentation:Any? )
    {
        // init instance here
    }
}

1 个答案:

答案 0 :(得分:1)

这是你之后的事吗?我在返回时使用self.init,因此需要required init

protocol JSONSerializable
{
    static func withJSONRepresentation( json:Any? ) -> Self?
}

class Class : JSONSerializable
{
    static func withJSONRepresentation( json:Any? ) -> Self?
    {
        return self.init( jsonRepresentation: json )
    }
    required init( jsonRepresentation:Any? )
    {
    }
}

class Subclass : Class
{
    required init( jsonRepresentation:Any? )
    {
        super.init(jsonRepresentation: jsonRepresentation)
    }
}

print(Class.withJSONRepresentation(nil))      // -> Class
print(Subclass.withJSONRepresentation(nil))   // -> Subclass

编辑:

另一种方法是返回JSONSerializable(或Class)实例,但是根据您的需要,您可能需要向下转换为所需的类型。

现有代码存在的问题是编译器无法保证您将履行返回Self实例的承诺。例如,在调用Subclass.withJSONRepresentation时,您的代码可能会返回Class(或其他任何内容)的实例,从而违反了承诺。实际上这是问题的关键 - 使用当前代码,如果json意味着需要返回Class,则必须在Class静态函数上调用它,而如果它应该返回一个Subclass,您必须在Subclass静态函数上调用它。 "自"不包含子类,因此如果在Class静态函数上调用它,它必须只返回Class实例,而不是子类。

protocol JSONSerializable
{
    static func withJSONRepresentation( json:Any? ) -> JSONSerializable?
}

class Class : JSONSerializable
{
    static func withJSONRepresentation( json:Any? ) -> JSONSerializable?
    {
        return Subclass( jsonRepresentation: json )
    }
    init?( jsonRepresentation:Any? )
    {
        // init instance here
    }
}

class Subclass : Class
{
}

print(Class.withJSONRepresentation(nil))