Автозаполнение вам поможет, но в основном, если Foo
это класс, вам просто нужен метод, который точно соответствует сигнатуре метода в вашем протоколе:
class Foo {}
protocol JSONInitializable {
static func initialize(fromJSON: [String : AnyObject]) throws -> Self?
}
extension Foo: JSONInitializable {
static func initialize(fromJSON: [String : AnyObject]) throws -> Self? {
return nil
}
}
В качестве примечания здесь вам нужно будет заменить в этом методе все экземпляры Foo
на Self
. Если вы хотите использовать конструктор, он должен быть помечен как требуемый.
Имея это в виду, вероятно, имеет смысл изменить ваш протокол на требование инициализатора, а не на статический метод с именем initialize
, и в этом случае взгляните на Ответ Блейка Локли. Однако этот ответ отвечает на вопрос о том, как поступать с Self
в протоколах, поскольку, безусловно, бывают случаи, когда нам может понадобиться метод, возвращающий Self
, который не является инициализатором.
Если Foo
не является классом, это тип значения, который не может быть подклассом, и поэтому мы возвращаем имя типа:
struct Foo: JSONInitializable {
static func initialize(fromJSON: [String : AnyObject]) throws -> Foo? {
return nil
}
}
enum Foo: JSONInitializable {
case One, Two, Three
static func initialize(fromJSON: [String : AnyObject]) throws -> Foo? {
return nil
}
}
Причина, по которой вам нужно вернуть Self?
из метода в случае класса, заключается в наследовании. Протокол заявляет, что если вы будете ему соответствовать, у вас будет метод с именем initialize
, тип возвращаемого значения которого будет опциональной версией того, чем вы являетесь.
Если мы напишем метод initialize
для Foo
так, как вы его написали, а затем, если мы создадим подкласс Foo
с Bar
, то теперь мы нарушим наше соответствие протоколу. Bar
унаследовал соответствие протоколу от Foo
, но у него нет метода, который вызывается initialize
и возвращает Bar?
. У него есть тот, который возвращает Foo
.
Использование здесь Self
означает, что когда наши подклассы наследуют этот метод, он будет возвращать любой тип, которым они являются. Self
является эквивалентом Swift Objective-C instancetype
.
person
nhgrif
schedule
28.03.2016