티스토리 뷰

iOS

iOS ) Swift에서의 namespace

Zedd0202 2017. 12. 20. 17:14
반응형

안녕하세요 :) Zedd입니다.ㅇ

요새 리팩토링을 엄청 열심히 하고 있는데....UIColor관리를 어떻게 해야할까 찾아보다가 엄청나게 재밌는글을 발견했습니다. 

Natasha The Robot -  Swift: The 😎 Case of An Enum With No Cases


그 전에 namespace라는 개념을 알고계시면 좋은데요. 

그냥 간단하게 말해서 그냥 관련있는 것들끼리 모아놓은 공간?이라고 생각하시면 편합니다. 

그래서 Swift에서도 이 namespace를 어떻게 만들고 그럴거냐..에 대한 건데요.


  1. struct ColorPalette {

        static let Red = UIColor(red: 1.0, green: 0.1491, blue: 0.0, alpha: 1.0)

        static let Green = UIColor(red: 0.0, green: 0.5628, blue: 0.3188, alpha: 1.0)

        static let Blue = UIColor(red: 0.0, green: 0.3285, blue: 0.5749, alpha: 1.0)


        struct Gray {

            static let Light = UIColor(white: 0.8374, alpha: 1.0)

            static let Medium = UIColor(white: 0.4756, alpha: 1.0)

            static let Dark = UIColor(white: 0.2605, alpha: 1.0)

        }

    }


자.. ColorPalette라는 구조체를 만들어주었고, 그 안에 타입프로퍼티를 만들어주었습니다. 또! 중첩타입을 사용해서 ColorPalette구조체 안에 Gray라는 구조체를 또 만들어주었네요.


사용은


  1. let red = ColorPalette.Red

    let darkGray = ColorPalette.Gray.Dark

 

이런식으로 할 수 있습니다. 엥 ColorPalette().Red가 아니라? ==> Red는 타입 프로퍼티니까요 :)

아무튼 이런식으로 UIColor만을 모아놓은 namespace를 하나 정의했다고 볼 수 있겠네요.

혼자 개발하면 좋겠지만...모두 협업을 하잖아요?

다른 개발자가 이 ColorPalette라는게 UIColor의 타입프로퍼티들을 모아놓은 namespace라는 것을 모르고 


  1. let myColorPallete = ColorPalette()


ColorPalette의 인스턴스를 만들어버립니다. 이걸만들어서 되는게 있나요? 아뇨 없죠. 우리는 이런상황을 바라지 않습니다. 그럼 어떻게 해야할까요? 

2가지 방법이 있습니다. 


1. init을 못하게하자!


  1. struct ColorPalette {


        private init() {}


        static let Red = UIColor(red: 1.0, green: 0.1491, blue: 0.0, alpha: 1.0)

        static let Green = UIColor(red: 0.0, green: 0.5628, blue: 0.3188, alpha: 1.0)

        static let Blue = UIColor(red: 0.0, green: 0.3285, blue: 0.5749, alpha: 1.0)

        

    .

    .

    .

    }



이렇게 init을 private로 만들어버리면,


이렇게, 인스턴스화 하려고 하면 에러가 납니다.

두번째 방법이 있습니다.



2. case가 없는 enum을 만들자. 

ㅇ? enum하면 case아닌가요?

case가 없는 enum이 가능;?


네! 가능합니다. 



  1. enum ColorPalette {


        static let Red = UIColor(red: 1.0, green: 0.1491, blue: 0.0, alpha: 1.0)

        static let Green = UIColor(red: 0.0, green: 0.5628, blue: 0.3188, alpha: 1.0)

        static let Blue = UIColor(red: 0.0, green: 0.3285, blue: 0.5749, alpha: 1.0)


        enum Gray {

            static let Light = UIColor(white: 0.8374, alpha: 1.0)

            static let Medium = UIColor(white: 0.4756, alpha: 1.0)

            static let Dark = UIColor(white: 0.2605, alpha: 1.0)

        }

    }


오 신기하죠? case가 없는 enum도 아주 잘 만들어집니다. enum안의 enum인 Gray도 case가 없도록 잘 만들어졌죠? 

사용방법은 위에서 구조체로 만든것과 동일합니다. 



  1. let red = ColorPalette.Red

    let darkGray = ColorPalette.Gray.Dark


그럼......다른 개발자가 이 enum을 인스턴스화 하려고 하면?


  1. let myColorPallete = ColorPalette()




바로 이렇게 에러가 나버리므로, ColorPalette를 인스턴스화 할 수 없습니다. :)

간단하죠? 원하시는대로 namespace를 잘 만드셨으면 좋겠습니다.

저는 enum을 사용하려구요 XD


출처 : 

Natasha The Robot - Swift: The 😎 Case of An Enum With No Cases

Namespaces in Swift


반응형