3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

structのMemberwise Initilaizer(swiftが用意してくれてるinit)の挙動

Posted at

structの生成ができない!と焦った経験があり、忘れないようにメモ程度で残します。

structのMemberwise Initilaizerについて

struct MyData {
	var name: String
}

上記のようなstructはinitを定義してなくても

let data = MyData(name: "hoge")

とMemberwise Initilaizerが存在します。

ただ場合によっては利用出来ないこともあります。

struct MyData {
	var name: String
	private var age: Int?
}

上記のようなstructがある場合、MyDataを生成することは不可能です。

ageがprivateになっているため、initを用意してくれてしまうとprivateとしての意味がなくなってしまうから。

だと思います。

struct MyData {
	var name: String
	private var age: Int?
	
	init(name: String, age: Int?) {
		self.name = name
		self.age = age
	}
}

そういうときにはinitを定義してあげるしかないですね。

privateな変数がある場合、initを定義せずにデータを生成する方法

privateな変数があるけどinitがないstructはたくさんのプロジェクトで使われてるはずです。

生成できないけど、どこで使われるのか。

import Foundation

struct MyData: Codable {
	var name: String
	private var age: Int?
}

jsonデータをdecodeするために、Codableを採用してる場合です。


ちなみにprivateな変数があるstructを生成しようとすると

error: 'MyData' initializer is inaccessible due to 'private' protection level

と怒られますが、
あまり経験したことがなく、
initも特に深く考えずに使ってることが多かったので焦りましたね。

initしてるだけだから、特にprivateの変数に外部からなにかしようとしてないんだけど!!なんで!?と思いハマっちゃいましたw

用意されるinitはinternalのものになるので、privateを勝手にinternalには変えてくれないということです。すごい当たり前の挙動ですねw

まあ考えてみれば当たり前のことなので、
お恥ずかしいですが、自分のような人はあまりいないと思いますが、メモとして残します!

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?