[ swift ] BookApp 트러블.. 슈팅은 못함

sonny·2025년 1월 4일
3

TIL

목록 보기
92/133

오늘 개발 중에 발생한 문제들을 해결하려 했지만, 예상치 못한 오류들이 계속해서 나타났다.

특히 viewModelcoreDataManager의 초기화 문제, 그리고 coreDataManager를 뷰 컨트롤러에 전달하는 과정에서 오류를 해결하려고 여러 방법을 시도했지만,

여전히 문제는 해결되지 않았다.

문제 1: Missing argument for parameter 'coreDataManager' in call

이 오류는 BookSearchViewController를 초기화할 때 발생했다.

BookSearchViewControllerviewModelcoreDataManager를 매개변수로 받는데 coreDataManager는 싱글톤 패턴을 사용하고 있기 때문에 CoreDataManager.shared로 인스턴스를 생성해야 했다.

그런데 그럼에도 불구하고 오류는 계속 발생했다.

정확히 말하자면 coreDataManager를 전달해야 하는데 이를 누락한 것이 문제였다.

이 오류를 해결하려고 다음과 같이 코드를 수정했다

import UIKit

class MainTabBarController: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // CoreDataManager 인스턴스를 생성
        let coreDataManager = CoreDataManager.shared  // CoreDataManager 싱글톤
        let viewModel = BookSearchViewModel() // ViewModel 초기화
        
        // 책 검색 화면
        let bookSearchVC = BookSearchViewController(viewModel: viewModel, coreDataManager: coreDataManager)
        let searchNavigationController = UINavigationController(rootViewController: bookSearchVC)
        searchNavigationController.tabBarItem = UITabBarItem(title: "검색",
                                                             image: UIImage(systemName: "magnifyingglass"),
                                                             tag: 0)
        
        // 담은 책 리스트 화면
        let savedBooksVC = SavedBooksViewController()
        let savedNavigationController = UINavigationController(rootViewController: savedBooksVC)
        savedNavigationController.tabBarItem = UITabBarItem(title: "담은 책 리스트",
                                                            image: UIImage(systemName: "bookmark"),
                                                            tag: 1)
        
        // 탭바에 뷰 컨트롤러 추가
        viewControllers = [searchNavigationController, savedNavigationController]
    }
}

위 코드와 같이 CoreDataManager.shared를 사용하여 싱글톤 인스턴스를 전달하도록 했지만, 여전히 문제가 해결되지 않았다.

코드에서 coreDataManager를 매개변수로 전달하는 부분에서 뭔가 놓친 것이 있나 싶다.
.
.

문제 2: Cannot assign value of type 'BookSearchViewController' to type '(any UISearchBarDelegate)?'

이번에는 UISearchBarDelegate와 관련된 오류가 발생했다.

BookSearchViewController에서 UISearchBarDelegate를 채택하고, searchBar.delegate = self를 설정하려 했는데,

selfBookSearchViewController 타입임에도 불구하고 위와 같은 오류가 발생했다.

문제는 BookSearchViewControllerUIViewController를 상속받고 있는데

그 자체가 UISearchBarDelegate를 명시적으로 채택하지 않았기 때문이었다.

BookSearchViewControllerUISearchBarDelegate를 채택하도록 수정해야 했다.

class BookSearchViewController: UIViewController, UISearchBarDelegate {
}

UISearchBarDelegate를 채택한 후에는 viewDidLoad에서 searchBar.delegate = self가 제대로 작동하긴 했다..

이렇게 delegate 관련 오류는 해결되었지만, 여전히 coreDataManager 전달 문제가 해결되지는 않았다.
.
.

문제 3: viewModelcoreDataManagerBookSearchViewController로 전달하는 방법

처음에 BookSearchViewController에서 viewModelcoreDataManager를 전달하는 방법을 제대로 이해하지 못했다.

BookSearchViewControllerviewModelcoreDataManager를 초기화 매개변수로 받는데,

이걸 MainTabBarController에서 어떻게 전달할지 확실히 알지 못했다.

BookSearchViewController의 초기화 코드에서 viewModelcoreDataManager를 제대로 전달하는 코드로 변경을 하긴 했는데

coreDataManager를 싱글톤으로 잘못 사용하는 부분이 있지 않았는지 다시 한 번 보긴 했다.

그리고 BookSearchViewControllerinit 메서드에서 viewModelcoreDataManager를 받아서 제대로 초기화하는 부분이 문제의 발단인 것 같은데

최종적으로 BookSearchViewController를 제대로 초기화하기 위해서는 viewModelcoreDataManager를 명시적으로 초기화하는 코드가 필요햇던 것 같다.

우선 아래와 같이 BookSearchViewController의 초기화 메서드를 확인하고 수정했다.

class BookSearchViewController: UIViewController {
    var viewModel: BookSearchViewModel
    var coreDataManager: CoreDataManager
    
    // Initializer
    init(viewModel: BookSearchViewModel, coreDataManager: CoreDataManager) {
        self.viewModel = viewModel
        self.coreDataManager = coreDataManager
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

이제 viewModelcoreDataManager를 제대로 전달한 뒤에 BookSearchViewController가 정상적으로 초기화가 되길 바랬지만

계속 fatalError가 생겼다.

이러한 과정에서 많은 시간이 걸렸고, 코드가 잘못 연결된 부분을 수정하는게 너무 힘들었다.

음...

오늘은 Missing argument for parameter 'coreDataManager' in call, Cannot assign value of type 'BookSearchViewController' to type '(any UISearchBarDelegate)?와 같은 여러 오류를 해결하려 했지만, 여전히 몇 가지 문제를 해결하지 못한 상태다.

이 과정에서 느낀 점은 정확한 오류 메시지를 분석해보고 이를 해결할 수 있는 방법을 찾는데 있어서 인내와 반복적인 점검이 중요하다는 걸 좀 알게 됐다.

성격이 급해서 이건가? 이건가? 하고 바로 수정해봐도 어차피 제대로 알지 못한채 수정하니 되지 않는게 당연했으니까.

이런 각 오류의 원인을 정확하게 찾아내고, 해결하기 위한 코드를 작성하는 과정이 중요한데 어렵다.

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보