싱글톤 패턴은 특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 유형 을 말한다.
이번 프로젝트에서 사용했던 User의 정보를 저장하기 위핸 만든 구조체이다.
struct UserData: Codable {
var name: String?
var userID: String
var password: String
var nickname: String?
var userImage: Data?
}
보통은 이 구조체에 접근해서 정보들을 추가, 삭제, 수정을 할 것이다. 그런데 ViewController마다 접근하는 파라미터가 다르다면, 제대로 유지하는 것이 힘들것이다.
UserData에 관련된 함수들이 여러개이기 때문에 UserDataManager라는 class를 만들었다. 이 class에는 사용자 추가, 프로필 업데이트, 로그아웃 등 사용자의 데이터에 관련된 함수들이 있다.
class UserDataManager {
// 사용자 추가
func addUser(userData: UserData) {
users.append(userData)
saveUsers()
}
// 사용자 목록 반환
func getUsers() -> [UserData] {
return users
}
}
이 클래스는 많은 ViewController에서 사용할 것이다. 그 때마다 인스턴스화 시켜서 사용한다면 비효율적일 것이다. 비효율적인 부분을 해결하기 위해 전역으로 인스턴스를 생성 해서, 이 인스턴스에 접근하자는 것이 Singleton 패턴이다.
우선 static 프로퍼티로 인스턴스를 생성해주자.
class UserDataManager {
// Singleton 인스턴스
static let shared = UserDataManager()
// 사용자 추가
func addUser(userData: UserData) {
users.append(userData)
saveUsers()
}
// 사용자 목록 반환
func getUsers() -> [UserData] {
return users
}
}
인스턴슬르 또 생성하는 것을 방지하기 위해 init 함수 접근제어자를 private로 지정해주자.
class UserDataManager {
// Singleton 인스턴스
static let shared = UserDataManager()
// 사용자 추가
func addUser(userData: UserData) {
users.append(userData)
saveUsers()
}
// 사용자 목록 반환
func getUsers() -> [UserData] {
return users
}
private init() {
}
}
이제 static 프로퍼티에 접근해서 사용을 하면 된다.
let userInfo = UserDataManager.shared.getUsers()