-
iOS/WebView/Project - 싱글톤 패턴 AppInfo 추가#9Project/Swift+WebView 2023. 1. 12. 09:21
IOS/Xcode 14X Swift5.7.2 WKWebView 에서 작업 진행
싱글톤(Singleton Pattern)이란?
디자인 패턴중에 하나이고 생성자가 여러번 호출되더라도 실제 생성되는 객체는 하나이고 객체를 다시 생성하더라도 이미 생성되어 있는 객체를 리턴한다.
DBCP(Database Connection Pool)와 같은 상황에서 많이 사용된다.
싱글톤 장점
- Instance를 최초 1회 생성하므로 메모리와 성능적인 측면에서 효율이 좋다.
- Singleton Instance는 전역 Instance로 다른 클래스들과 데이터 공유가 쉽다.
- Instance가 1개라는 것을 보증받는다. (Thread Safe)
싱글톤 단점
- Singleton Instance로 많은 데이터를 공유 시킬 경우 다른클래스의 결합도가 높아져 "개방=폐쇄"원칙(OCP, Open-Closed Principle)을 위배함 즉, 수정과 테스트가 어려워짐
진행 중인 프로젝트에서는 App 정보 및 WebView URL (LOCAL | DEV | QA | PROD)를 공유해서 사용해 보겠다.
싱글톤 클래스 생성 및 활용
AppInfo Class 생성
import Foundation class AppInfo { // 싱글톤 클래스 static let shared = AppInfo() // static을 이용해 Instance를 저장할 프로퍼티를 하나 생성 private init() {} var mainInfo: [String : Any]? { guard let info = Bundle.main.infoDictionary else { return nil } return info } var name: String? { self.mainInfo?["CFBundleName"] as? String } var scheme: String? { guard let urlTypes = self.mainInfo?["CFBundleURLTypes"] as? [AnyObject], let urlTypeDictionary = urlTypes.first as? [String: AnyObject], let urlSchemes = urlTypeDictionary["CFBundleURLSchemes"] as? [AnyObject], let scheme = urlSchemes.first as? String else { return nil } return scheme } var version: String? { self.mainInfo?["CFBundleShortVersionString"] as? String } var url: String = "https://naver.com" }
어느 클래스에서든 shared란 static 프로퍼티로 접근하면 하나의 Instance를 공유
싱글톤 클래스 접근
import Foundation import UIKit class InitViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. print("######### Init ViewController - viewDidLoad") let appInfo = AppInfo.shared print("appInfo.url : \(appInfo.url)") // 싱글톤 인스턴스 url에 값 변경 appInfo.url = "http://localhost" print("appInfo.url : \(appInfo.url)") // Optional Binding if let appName = appInfo.name, let appScheme = appInfo.scheme, let appVersion = appInfo.version { print("appName: \(appName)") print("appScheme: \(appScheme)") print("appVersion: \(appVersion)") } } }
참조
https://ukseung2.tistory.com/8
https://dvlpr-chan.tistory.com/36
https://trumanfromkorea.tistory.com/36
'Project > Swift+WebView' 카테고리의 다른 글
iOS/WebView/Project - 서버별 테스트 환경 만들기#11 (0) 2023.01.13 iOS/WebView/Project - Constants 및 Utils 분리#10 (0) 2023.01.13 iOS/WebView/Project - BaseViewController 모듈화#8 (0) 2023.01.11 iOS/WebView/Project - Splash 등록/설정#7 (0) 2023.01.11 iOS/WebView/Project - Assets 생성/등록#6 (0) 2023.01.10