iOS) Alert 창 만드는 커스텀 메서드 분석하기

2 minute read

다음은 제가 코드리뷰를 작성하던 도중 기록하고 싶은 내용이라서 그대로 가져왔습니다.


출발

extension UIViewController {

    func makeAlert(title : String,
                   message : String,
                   okAction : ((UIAlertAction) -> Void)? = nil,
                   completion : (() -> ())? = nil)
    {
        let alertViewController = UIAlertController(title: title, message: message,
                                                    preferredStyle: .alert)

        let okAction = UIAlertAction(title: "확인", style: .default, handler: okAction)
        alertViewController.addAction(okAction)

        self.present(alertViewController, animated: true, completion: completion)
    }
}

이 메서드의 역할은

  • 성공적으로 로그인,회원가입 시 UIAlertAction 에 handler 가 필요
  • 성공적이지 않으면 동작을 하지 않기 때문에 handler 가 불필요(그냥 Alert 창이 닫힘)

이라고 생각해요.

그렇다면 alert 창을 만드는 커스텀 메서드를 만들 때 파라미터로 UIAlertAction 의 handler 를 받으면 되겠다! 라는 생각에서 출발해보면 될거같아요.

handler 가 있을수도.. 없을수도.. 그렇다면 옵셔널!

handelr 가 없다면 굳이 함수 호출시에 파라미터를 받지 않아도 되겠다..? 그렇다면 파라미터의 기본값 설정!

이런 생각을 가지고 코드를 다시 한번 살펴보면 좋을거 같아요.

extension UIViewController {

    func makeAlert(title : String,
                   message : String,
                   ❗️okAction : ((UIAlertAction) -> Void)? = nil,
                   ❗️completion : (() -> ())? = nil)
    {
        let alertViewController = UIAlertController(title: title, message: message,
                                                    preferredStyle: .alert)

        let okAction = UIAlertAction(title: "확인", style: .default, handler: ❗️okAction)
        alertViewController.addAction(okAction)

        self.present(alertViewController, animated: true, completion: ❗️completion)
    }
}

alertViewController 가 나타나고나서 동작하는 completion 역시 동일하게 생각하면 될거 같아요!

지금은 잘 이해가 안되더라도 구조에 대해서 눈에 담고 넘어가보자구요!

사용해보자!

self.makeAlert(title: "회원가입", message: "회원 가입 성공", okAction: { _ in
    self.presentToCheckinViewController()
})
// okAction 과 completion 은 파라미터 기본값을 가지도록 설정했기때문에 다음과 같이 사용 가능.
self.makeAlert(title: "로그인", message: "가입 실패")

_ …???? wirdcard 패턴

_ in 여기서 _이거는 와일드카드라고 불리는 녀석인데요! 👀 _ 쓴 곳은 무시할 수 있다는 것입니다. 음.. 와일드카드 패턴을 통해서 우리는 코드를 좀 더 이쁘고 가독성 높게 짤 수 있는데요. 몇가지를 알아보자구요

// ✅ for 뒤에 오는 변수를 사용하지 않을 경우. 즉, 특정 작업만 두번 반복할 경우에 와일드카드를 사용함으로써 불필요한 변수선언을 막고 특정 작업에 집중할 수 있도록 합니다.
for _ in 12 {
    // 특정 작업을 두번 반복
}

// 아래의 코드처럼 함수를 사용할 때 파라미터에서 사용하는 경우도 보셨을텐데여!
func function(_ a: Int, _ b: Int) {
}
// ✅ 이럴때는 argument, parameter 라고 구분한답니다. argument 는 함수 외부에서 호출할 때, parameter 는 함수 내부에서 호출할 때 사용해요. 하나면 쓰면 parameter 라고 부르더라구요
// 이렇게 외부에서 호출할 때 파라미터가 무슨 역할을 하는지 무시할 수 있죠! 내부에서는 a와b 로 호출 하면 된답니다.
function(1, 2)
// ✅ 위의 와일드 카드, argument, parameter 를 잘 사용하면 개발자가 함수의 파라미터 역할에 대해서 이해하고 사용하는데 효율적이랍니당

다시돌아와서 우리가 okAction : ((UIAlertAction) -> Void)? 이렇게 선언했어요. 해석하자면? UIAlertAction 을 가지고 Void 를 리턴하겠다. 라는 뜻이거든요? 그래서 okAction 파라미터에 다음과 같이 클로저를 넣었을 때 UIAlertAction 타입을 가지는 변수는 사용할 일이 없기 때문에 와일드 카드를 사용해준 코드입니당. 그리고 Void 를 리턴하기 때문에 원하는 액션을 넣을 수 있었어요

// okAction
{ _ in

    // 확인 뷰로 넘어가는 커스텀 메서드
    self.presentToCheckinViewController()
}

잠깐. 이대로 끝낼 생각 마라.

okAction : ((UIAlertAction) -> Void)? = nil,
completion : (() -> ())? = nil)

여기서부터 사실 좀 어지러웠어요; 가장 최적의 파라미터의 자료형.. 이건 어떻게 생각을 해내냔말야..!(라고 할뻔 ㅋㅋ)

제가 저렇게 생각을 했어서 남겨볼게요. 단순해요!

스크린샷 2021-11-10 오전 11 02 29

여기처럼 주어지잖아요! 이젠 파라미터를 무서워하면서 쓰지 말아보자구요 야호

Categories:

Updated: