我有一个类集群 - 当我从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
}
}
答案 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))