iOS/UIKIT

ViewController 에서 init을 통해 데이터를 전달하는 방식이 깔끔한 이유

밤새는 탐험가89 2024. 10. 22. 11:33
import UIKit
import SDWebImage

class FullScreenImageViewController: UIViewController {
	...
    // MARK: - Properties
    private var images: [String] = []
    private var currentIndex: Int = 0
    
    // MARK: - Initializer
    init(images: [String], currentIndex: Int) {
        self.images = images
        self.currentIndex = currentIndex
        super.init(nibName: nil, bundle: nil)
        self.modalPresentationStyle = .fullScreen
    }
    ...

 

 

 FullScreenImageViewController에서 이미지를 init을 통해 받는 방식은 의도적으로 ViewController를 초기화할 때 필요한 데이터를 안전하게 전달하기 위해 사용한 것입니다. 하지만 사용자가 제안한 대로 변수를 선언하고 ViewController가 화면에 표시되기 전에 데이터를 설정하는 방법도 가능합니다.

 

1. init을 통해 데이터를 전달하는 방식

장점:

  • 데이터를 ViewController가 생성될 때 한 번에 전달하므로, ViewController가 초기화되는 시점에 필요한 모든 정보를 가지고 있게 됩니다.
  • ViewController가 초기화될 때 필수적인 데이터를 전달받도록 강제할 수 있어, 개발 중 실수로 인해 데이터가 누락되는 것을 방지합니다.
  • 코드 구조가 명확하고 데이터의 흐름을 이해하기 쉽습니다.
init(images: [String], currentIndex: Int) {
    self.images = images
    self.currentIndex = currentIndex
    super.init(nibName: nil, bundle: nil)
}

 

이 방식은 FullScreenImageViewController를 사용할 때 반드시 필요한 데이터를 제공하도록 강제하므로 안전성이 높아집니다.

2. 변수를 선언하고 이후에 데이터를 설정하는 방식

장점:

  • ViewController를 초기화한 후 데이터를 나중에 설정할 수 있어, 상황에 따라 유연하게 사용할 수 있습니다.
  • 초기화 시점에 데이터를 제공하지 않고, 특정 이벤트가 발생할 때 데이터를 설정할 수 있습니다.
class FullScreenImageViewController: UIViewController {
    // MARK: - Properties
    var images: [String] = []
    var currentIndex: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        // setup logic
        updateImage()
    }
}

 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let fullScreenVC = FullScreenImageViewController()
    fullScreenVC.images = detailImages
    fullScreenVC.currentIndex = indexPath.item
    present(fullScreenVC, animated: true)
}

 

 

단점:

  • 데이터를 나중에 설정하기 때문에 viewDidLoad 등에서 images나 currentIndex에 대한 의존성이 있을 때, 누락되면 문제가 발생할 수 있습니다.
  • 잘못된 시점에 데이터가 전달되면 UI가 올바르게 업데이트되지 않을 수 있습니다.

결론

둘 중 어떤 방식을 선택할지는 사용자의 상황과 요구에 따라 다릅니다. 일반적으로 ViewController가 꼭 필요한 데이터가 있다면 init을 통해 초기화 시점에 받는 것이 안전하고 깔끔한 방법입니다. 하지만 데이터 전달 시점에 유연성이 필요하다면 변수를 사용해 나중에 설정하는 방식도 괜찮습니다.