iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Kotlin】引数ごとにdata classのコンストラクターを使い分けたい

結論

Kotlinでは下記のように、constructor()キーワードを使うことで、セカンダリコンストラクターとして、引数に応じてClassを初期化することができるようです。Swiftでは、init()で初期化方法を分けることができましたよね👀

    override var instagram: String? = null,
    override var twitter: String? = null,
    override var facebook: String? = null,
    override var youtube: String? = null,
    override var github: String? = null,
    override var web: String? = null,
    override var isGuide: Boolean,
    override var name: String,
    override var fideeId: String,
    override var description: String,
    override var imagePath: String
): FirebaseUserDataInterface {
    constructor(user: FirebaseUserCreateParameter)
            : this(
        user.instagram,
        user.twitter,
        user.facebook,
        user.youtube,
        user.github,
        user.web,
        user.isGuide,
        user.name,
        user.fideeId,
        user.description,
        user.imagePath
    )
}

ちなみに、プライマリーコンストラクターに初期化コードを含めることはできないらしいので、初期化時にコードを実行したい場合はinitキーワードを使用します。また、クラスないの初期化コードは、記述した順に実行されるらしいです✍️

class InitOrderDemo(name: String) {
    val firstProperty = "First property: $name".also(::println)
    
    init {
        println("First initializer block that prints ${name}")
    }
    
    val secondProperty = "Second property: ${name.length}".also(::println)
    
    init {
        println("Second initializer block that prints ${name.length}")
    }
}

// First property: hello
// First initializer block that prints hello
// Second property: 5
// Second initializer block that prints 5

また、セカンダリコンストラクターによってクラスが初期化された場合も、初期化ブロックは呼び出され、その場合、記述順に限らずセカンダリコンストラクターブロックよりも先にinit { }ブロックが呼び出されます。

class Constructors {
    init {
        println("Init block")
    }

    constructor(i: Int) {
        println("Constructor $i")
    }
}

// Init block
// Constructor 1

てな感じで本日も以上となります🍺

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com