싱글이다
Singleton Pattern
자기 자신의 인스턴스를 type property 형태로 저장하여 별도의 인스턴스 생성없이 공용으로 사용할 수 있다
class 내에서 보통 인스턴스명으로 shared, standard를 많이 사용함
왜 쓰는가?
인스턴스를 사용할 때 마다 남발하면 메모리의 사용량이 증가할 수 밖에 없다
싱글톤 패턴은 하나의 인스턴스만 메모리에 올려놓고 필요할 때 꺼내 쓰기 때문에 메모리 낭비를 줄일 수 있다
주의점
싱글톤 패턴을 사용할 때 private init() {} 을 이용하여 초기화 구문이 동작하지 않게 해주어야 한다.
싱글톤 패턴을 만들어 놓은 파일내에서가 아닌 다른 파일에서 동일한 인스턴스를 만들면 싱글톤 패턴 자체가 깨진다
처음에는 왜 쓰지? 했다가 요즘에는 없으면 왜 안쓰지? 라는 생각이 드는 싱글톤 패턴이다
class UserDefaultsHelper {
let userDefaults = UserDefaults.standard
private init() {}
enum Key: String {
case nickname
case age
}
var nickname: String {
get {
UIApplication.shared
FileManager.default //데이터에 대한 동기화 관점을 활용하기 위해서 singleton Pattern 활용
return userDefaults.string(forKey: Key.nickname.rawValue) ?? "대장"
}
set {//연산 프로퍼티 parameter
userDefaults.set(newValue, forKey: Key.nickname.rawValue)
}
}
var age: Int {
get {
return userDefaults.integer(forKey: Key.age.rawValue) //bool도 기본값이 있다 integer는 기본값이 0
}
set {
userDefaults.set(newValue, forKey: Key.age.rawValue)
}
}
}
Extension에서 Protocol 활용
화면전환 구현을 할 때 화면전환 구현을 하는 모든 파일 마다 identifier를 설정하여 호출하는 방식으로 생성했었다.
하지만 identifer를 명시하는 Protocol을 만든 후 identifer 호출이 필요한 Controller에 Extension을 활용하여 Protocol을 채택하면 더이상 identifier를 파일마다 설정해주는 수고?는 덜하게 된다
protocol ReusableViewProtocol {
static var reuseIdentifier: String { get }
}
extension UIViewController: ReusableViewProtocol {
static var reuseIdentifier: String {
String(describing: self)
}
}
extension UITableViewCell: ReusableViewProtocol {
static var reuseIdentifier: String {
String(describing: self)
}
}
Extension 내에는 메모리 공간을 차지하는 저장프로퍼티는 사용하지 못 한다
Enum vs Struct
저장 프로퍼티를 만들 때 Enum을 사용해야할까? Struct를 사용해야할까?
별차이 없지 않나?
최근들어 느끼는데 컴퓨터에서는 별차이 없는건 없고 쓰는 이유가 다 있다
위에서 Singleton Pattern을 설명할 때 언급했지만 인스턴스 남발은 좋지 않다
Enum은 위에서도 말했듯 저장프로퍼티를 사용하지 못하고 인스턴스 생성이 불가능하다
다들 알다싶이 Struct는 인스턴스 생성이 가능하다 (Private init(){}을 쓰면 되긴 하지만)
인스턴스 생성 방지의 관점에서 쓰는 것이 불가능한 것과 쓸수는 있지만 쓰지 않는 것의 차이라고 보면 된다 (안 vs 못)
Enum case vs Enum static
case는 대문자를 사용하지 못하고 중복될 수 없기 때문에 제약이 되는 두 경우 Enum 내에서 타입 저장 프로퍼티를 사용하는 것이 더 좋다
'Tech > iOS' 카테고리의 다른 글
[iOS] Day30 - Rest API (0) | 2022.08.02 |
---|---|
[iOS] Day29 - Api 통신 (0) | 2022.08.01 |
[iOS] Day 26 - Custom Font (0) | 2022.07.29 |
[iOS]Day 26 - Notification (0) | 2022.07.29 |
[iOS] Day 25 - Protocol (0) | 2022.07.28 |