46
44

More than 5 years have passed since last update.

[Swift]自分自身のインスタンスを返すときは"Self" を使うと便利。

Last updated at Posted at 2014-12-01

戻り値でインスタンスを返すクラスメソッドを作る機会って、結構多いと思うんですが、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” で、これと同様のことができます。

46
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
44