オートコンプリートがお手伝いしますが、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
}
}
、あなたは、このメソッド内で、のすべてのインスタンスを交換する必要があります210はSelf
である。コンストラクターを使用する場合は、必要に応じてマークされたコンストラクターにする必要があります。
これを念頭に置いて、という静的メソッドではなく、イニシャライザが必要な場合は、Blake Lockley's answerを参照してください。しかし、この答えは、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
と呼ばれるメソッドを持ち、その戻り値の型はあなたの任意のバージョンであることを宣言します。
我々はFoo
年代initialize
メソッドを記述する場合、あなたがそれを書いたように、我々はBar
でFoo
をサブクラス化した場合、その後、その後、今、私たちは私たちのプロトコルに準拠し壊れています。 Bar
は、Foo
からプロトコルへの適合を継承しましたが、initialize
と呼ばれ、Bar?
を返すメソッドはありません。それはFoo
を返すものを持っています。
ここでSelf
を使用すると、私たちのサブクラスがこのメソッドを継承するときには、どんな型でも返すことになります。 Self
はスウィフトのObjective-C's instancetype
に相当します。
だからこれは私がメソッドからFoo' '型のオブジェクトを返してみましょうでしょうか? – smac89
'Foo'のインスタンスで呼び出すと' Foo'を返します。 'Foo'をサブクラス化して' class Bar:Foo'を作ると 'Bar'を返します。 – nhgrif
私はこれを試しましたが、メソッドから 'Foo'型のオブジェクトを返そうとするとエラーになります。 'Foo'型の式を 'Self'型に変換できないと言っています。xcode 7.3を使用しています。 – smac89