iOS 프로젝트를 진행하다 보면 자연스럽게 필요한 Asset들과 생성한 파일(ex. 스토리보드)들이 들어나게 된다.
이러한 것들을 코드 내에서 불러올 때 직접 이름을 타이핑하여 불러오는 것이 기본적인 방법일 것이다.
하지만 이렇게 직접 하드코딩하여 에셋을 불러오면 몇가지 문제점이 발생 할 수 있다.
이러한 단점을 보완하는 방법이 namespace를 생성하여 에셋을 상수로 처리하는 것이다.
Swift는 공식적으로 namespace를 생성하는 문법을 제공하고 있지는 않다. 하지만 이미 존재하는 자료구조를 사용하여 임의로 namespace를 생성할 수 있다.
import UIkit
struct Const {
private init() {}
}
extension Const {
Struct Image {
private init() {}
// 텍스트 필드 아이콘
static let clearCircle = UIImage(systemName: "xmark.circle")
static let passwordShown = UIImage(named: "password_shown_eye_icon")
static let passwordHidden = UIImage(named: "password_hidden_eye_icon")
}
}
Struct를 이용하여 Const 구조체를 생성하고 이를 extension하면서 에셋을 상수처리 하고 있다.
이 때, 주의할 점은 Struct의 생성자를 private으로 제한해야 한다는 점이다.
그 이유는 private이 아니라 public으로 놓을 경우 외부에서 initializer를 이용하여 Image 인스턴스를 생성할 수 있기 때문이다. 에셋 상수화를 위한 구조체의 인스턴스가 생성 가능해진다면 내가 아닌 다른 사람들과 협업을 할 때 혼란이 생길 수도 있기 때문에 init()을 private으로 처리해주는 과정이 필요하다.
import UIKit
struct Const {
private init() {}
}
extension Const {
enum Image {
// 텍스트 필드 아이콘
static let clearCircle = UIImage(systemName: "xmark.circle")
static let passwordShown = UIImage(named: "password_shown_eye_icon")
static let passwordHidden = UIImage(named: "password_hidden_eye_icon")
}
}
기본적인 구조는 Struct를 이용한 것과 같지만 Struct 대신에 enum을 사용하는 방법이다.
enum은 기본적으로 초기화를 제공하지 않기 때문에 외부에서 인스턴스 생성이 원초적으로 불가능해진다.
앞선 두가지 방법 모두 사용이 가능하며 Struct를 활용할 때에 생성자를 private로 설정하는 것을 잊지말자!