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