새소식

iOS/UIKit

Switch Case문에서 특정 조건들에서는 함수를 호출 안하기.

  • -

Switch Case문을 쓰면 특정 Case들에서만 함수를 호출 안하게 만들고 싶을 때가 있다.

Swithc Case 문에서는 if 문 대신에 where 절을 사용하지만 이렇게 만들면 기본 구조가 보기 힘들어질 수 있기 때문에 다른 방식을 이용해서 해당 문제를 해결해보고자 하자.

 

1. 여기선 checkAlbumPermission이라는 함수를 실행하면 내부에 presentImagePicker를 실행하도록 만들었다.

editPhotoButton // edit Photo Button을 누른다면
    .tapPublisher
    .sink { [weak self] in
        self?.checkAlbumPermission { //checkAlbumPermission 실행
            DispatchQueue.main.async {self?.presentImagePicker(withType: .photoLibrary)} // imagePicker는 UI이기 때문에 main thread에서 실행 되어야 해서 Dispatchqueue.main을 사용하였다.
        }
    }
    .store(in: &cancellables) // memory leak 을 방직하기 위한 코드.

 

2. imagePicker의 경우에는 단순히 imagepicker이기에 특별한 부분은 없다. 이제 checkAlbumPermission 내부를 봐보자.

private func presentImagePicker(withType type: UIImagePickerController.SourceType) {
    let pickerController = UIImagePickerController()
    pickerController.delegate = self
    pickerController.sourceType = type
    present(pickerController, animated: true)
}

 

3. checkAlbumPermission을 보면 completion @escaping을 활용해서 .limited와 .authorized에서만 completion()이 완료되면서 끝나서 원래의 함수로 돌아가고 .denied와 .other들의 경우에는 completion()이 끝나지 않으면서 클로저 내부에 있는 presentImagePicker가 실행이 되지 않는다.

private func checkAlbumPermission(completion: @escaping() -> Void) {
    PHPhotoLibrary.requestAuthorization(for: .readWrite) { (status) in
        switch status {
        case .limited:
            completion()
        case .authorized:
            completion()
        case .denied:
            print("Album: 권한 거부")
        case .restricted, .notDetermined:
            print("Album: 선택하지 않음")
        default:
            break
        }
    }
}

우선 코드를 만들기는 했는데 completion: @escaping() -> Void 를 활용하는 방법에 대해 익숙치가 않다. 해당 부분에 대해서 앞으로 숙달하도록 하자!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.