戻り値でインスタンスを返すクラスメソッドを作る機会って、結構多いと思うんですが、Swiftでやるときの方法です。
参考サイト:
objective c - How can I return instancetype in Swift - Stack Overflow
インスタンスを返すメソッドの戻り値に “Self" を使う
サンプルコードは下記です。クラスAがあり、 Aを継承してBとCを定義しています。Aに、インスタンスを取得するクラスメソッド instance() を定義し、戻り値をSelfとしています。
で、クラスBとCで instance()を呼ぶと、それぞれBのインスタンスとCのインスタンスを返してくれます。
class A {
required init() {}
func nameOfClass() -> String {
return "Class A"
}
class func instance() -> Self {
return self()
}
}
class B: A {
required init() {
super.init()
}
override func nameOfClass() -> String {
return "Class B"
}
}
class C: A {
required init() {
super.init()
}
override func nameOfClass() -> String {
return "Class C"
}
}
let a = A.instance().nameOfClass() // "Class A"
let b = B.instance().nameOfClass() // "Class B"
let c = C.instance().nameOfClass() // "Class C"
メリット
これの何が便利かと言うと、class Bとclass Cでわざわざinstance()を書かなくて良いところですね。例えば、以下の様なメソッドが不要になります。
// こういうのをいちいち書かなくて済む
extension B {
class func instance() -> B {
return self()
}
}
Objective-C の場合
Objective-Cでは “instancetype” で、これと同様のことができます。