/*
iOS 싱글톤 사용 예
*/
let screen = UIScreen.main
let userDefaults = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default
@Singleton Class 예제
/*
static 전역 변수로 선언한 것은 지연(lazy) 생성되므로
처음 Singleton을 생성하기 전까지 메모리에 올라가지 않음
*/
class SingletonClass {
static let shared = SingletonClass() // static -> type property ; 실제로 사용될때 생성됨(지연생성)
var x = 0
}
let singleton1 = SingletonClass.shared // => 여기까진 SingletonClass() 와 동일
singleton1.x = 10
let singleton2 = SingletonClass.shared
singleton2.x = 20
singleton1.x //
singleton2.x //
SingletonClass.shared.x = 30
SingletonClass.shared.x //
singleton1.x //
singleton2.x //
@다음과 같은 경우는 어떻게 될까?
SingletonClass().x = 99 // 변수에 따로 저장히자 않았기 때문에 생성과 동시에 삭제
SingletonClass().x //
singleton1.x //
singleton2.x //
=> 결과는 이렇다
@Singleton을 사용하지 않고 코드 작성시
class User {
var friends: [Friends] = []
var blocks: [Friends] = []
}
struct Friends: Equatable {
let name: String
}
/*
↑ User와 Friends 타입은 수정 금지
↓ FriendList 타입은 수정 허용
*/
class FriendList {
var user: User
init(user: User) {
self.user = user
}
func addFriend(name: String) {
let a = Friends(name: name)
user.friends.append(a)
// 호출 시 해당 이름의 친구를 friends 배열에 추가
}
func blockFriend(name: String) {
let a = Friends(name: name)
if let index = user.friends.firstIndex(of: a) {
user.friends.remove(at: index)
}
if !user.blocks.contains(a) {
user.friends.append(a)
}
// 호출 시 해당 이름의 친구를 blocks 배열에 추가
// 만약 friends 배열에 포함된 친구라면 friends 배열에서 제거
}
}
//
let user = User()
var friendList = FriendList(user: user)
friendList.addFriend(name: "원빈")
friendList.addFriend(name: "장동건")
friendList.addFriend(name: "정우성")
user.friends // 원빈, 장동건, 정우성
friendList.blockFriend(name: "정우성")
user.friends // 원빈, 장동건
user.blocks // 정우성
@Singleton 사용시
class User {
static let shared = User()
var friends: [Friends] = []
var blocks: [Friends] = []
}
struct Friends: Equatable {
let name: String
}
class FriendList {
func addFriend(name: String) {
let user = User()
let friend = Friends(name: name)
user.friends.append(friend)
// "원빈", "장동건", "정우성" 3명을 친구로 추가했을 때
// 최종적으로 user.friends 에 들어있는 friend 의 숫자는?
// let user = User.shared
// let friend = Friends(name: name)
// user.friends.append(friend)
}
func blockFriend(name: String) {
let friend = Friends(name: name)
if let index = User.shared.friends.firstIndex(of: friend) {
User.shared.friends.remove(at: index)
}
if !User.shared.blocks.contains(friend) {
User.shared.blocks.append(friend)
}
}
}
var friendList = FriendList()
friendList.addFriend(name: "원빈")
friendList.addFriend(name: "장동건")
friendList.addFriend(name: "정우성")
User.shared.friends
friendList.blockFriend(name: "원빈")
User.shared.friends
User.shared.blocks
=> 복습으로 제학습이 필요함!!