Это вы, что после вас? Я использую 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
EDIT:
Альтернативой вернуть экземпляр JSONSerializable (или класса), но в зависимости от ваших потребностей, вы, возможно, придется обратное приведение к требуемому типу.
Проблема с вашим существующим кодом заключается в том, что компилятор не может гарантировать, что вы встретите свое обещание вернуть экземпляр Self
. Например, при вызове Subclass.withJSONRepresentation
ваш код может вернуть экземпляр Class
(или что-то еще), что нарушает обещание. На самом деле это главный вопрос - с вашим текущим кодом, если json означает, что ему нужно вернуть Class
, вам придется называть его на статической func Class
, тогда как если он должен вернуть Subclass
, вам придется позвонить это на статической функции Subclass
. «Я» не включает подклассы, поэтому, если вы вызываете статический func 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))
Мне не совсем понятно, почему тип возврата - это «Я?». Для кластера классов возвращаемым типом будет «класс зонтика» (например, «класс»), но возвращаемые значения являются экземплярами некоторого подкласса. –
Это из-за соответствия _JSONSerializable_. вызов _Class.withJSONRepresentation() _ должен возвращать подкласс класса _Class_ – nielsbot