はじめに
CustomView
をコードで実装した際に、init
メソッドに関しての理解が曖昧でしたので備忘録として投稿します。
動作環境
【Xcode】Version 12.0.1
【Swift】Version 5.3
実装コード
CustomView.swift
import UIKit
class CustomView: UIView {
var imageView: UIImageView!
// 詳細説明①
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
// 詳細説明②
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
private func setup(){
let iWidth: CGFloat = 200
let iHeight: CGFloat = 200
let posX: CGFloat = (self.frame.width - iWidth)/2
let posY: CGFloat = (self.frame.height - iHeight)/2
imageView = UIImageView(frame: CGRect(x: posX, y: posY, width: iWidth, height: iHeight))
imageView.image = UIImage(named: "hoge")
self.addSubview(imageView)
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let customView = CustomView()
customView.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height)
self.view.addSubview(customView)
}
}
詳細説明①
override init(frame: CGRect) {
super.init(frame: frame)
}
- 通常のイニシャライザ(
required
が付かないイニシャライザ)はサブクラスで実装しても実装しなくても良いが、初期化などを行う場合はoverride
を必ず付ける必要があります。
詳細説明②
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
- 必須のイニシャライザ(
required
が付いてるイニシャライザ)はサブクラスで絶対に実装しないといけません。 -
init?(coder aDecoder: NSCoder)
のイニシャライザはNSCoding
プロトコルで定義されており、それがUIView
クラスで実装されているので、サブクラスでも実装する必要があるということになります。