namespace 생성하기 (에셋 상수처리)

이세진·2022년 9월 20일
0

iOS

목록 보기
36/46

iOS 프로젝트를 진행하다 보면 자연스럽게 필요한 Asset들과 생성한 파일(ex. 스토리보드)들이 들어나게 된다.

이러한 것들을 코드 내에서 불러올 때 직접 이름을 타이핑하여 불러오는 것이 기본적인 방법일 것이다.

하지만 이렇게 직접 하드코딩하여 에셋을 불러오면 몇가지 문제점이 발생 할 수 있다.

  1. 오타의 가능성
  2. 추후 에셋 이름을 수정하게 되면 해당 에셋을 사용한 모든 곳을 직접 찾아가서 수정해야한다.

이러한 단점을 보완하는 방법이 namespace를 생성하여 에셋을 상수로 처리하는 것이다.

Swift는 공식적으로 namespace를 생성하는 문법을 제공하고 있지는 않다. 하지만 이미 존재하는 자료구조를 사용하여 임의로 namespace를 생성할 수 있다.

Struct를 활용

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으로 처리해주는 과정이 필요하다.

enum을 활용

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로 설정하는 것을 잊지말자!

profile
나중은 결코 오지 않는다.

0개의 댓글