특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 유형
class Info {
var image: String
var name: String
var age: Int
}
A 뷰컨트롤러에서 image를, B 뷰컨트롤러에서 name과 age의 정보를 받아 UserInfo 클래스에 저장해야 한다고 하자.
// A 뷰컨트롤러
let infoImg = Info().image
infoImg = "Jenny"
// B 뷰컨트롤러
let infoName = Info().name
infoName = "Jenny"
let infoAge = Info().age
infoAge = 24
이렇게 저장할 시, 각 Instance의 프로퍼티에만 저장되고, 하나의 Instance에 모든 정보가 저장되지 못한다.
→ Info 클래스에 대한 Instance는 최초 생성될 때, 한 번만 생성해 전역에 두고, 그 이후에는 Instance 접근만 가능하게 하자 !
= Singleton Pattern
예시
: CollectionView에서 셀 클릭 시, 해당 셀의 데이터를 다음 뷰 컨트롤러에 전달하는 경우
Singleton class 생성
// SingletonInfo.swift
class SingletonInfo {
// 1. static 프로퍼티로 Instance 생성
static let shared = SingletonInfo()
var image: String
var name: String
var age: Int
// 2. init 함수 접근제어자 private로 지정
private init() {
image = "0inn"
name = "영인"
age = 24
}
}
CollectionView 클릭 시, SingletonInfo
에 데이터 입력
// CollectionViewController.swift
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = testModel.itemAt(indexPath.row)
// 싱글톤 사용하여 데이터 전달
SingletonInfo.shared.image = cell.image
SingletonInfo.shared.name = cell.name
SingletonInfo.shared.age = cell.age
// 화면 전환
presentNVC(SingletonTestViewController())
}
클릭 시, 보여질 뷰 컨트롤러에 SingletonInfo
데이터 전달
// SingletonTestViewController.swift
private func setupDisplay() {
image.image = UIImage(named: SingletonInfo.shared.image)
name.text = SingletonInfo.shared.name
age.text = String(SingletonInfo.shared.age)
}
참조 블로그