오늘 개발 중에 발생한 문제들을 해결하려 했지만, 예상치 못한 오류들이 계속해서 나타났다.
특히 viewModel
과 coreDataManager
의 초기화 문제, 그리고 coreDataManager
를 뷰 컨트롤러에 전달하는 과정에서 오류를 해결하려고 여러 방법을 시도했지만,
여전히 문제는 해결되지 않았다.
Missing argument for parameter 'coreDataManager' in call
이 오류는 BookSearchViewController
를 초기화할 때 발생했다.
BookSearchViewController
는 viewModel
과 coreDataManager
를 매개변수로 받는데 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
를 매개변수로 전달하는 부분에서 뭔가 놓친 것이 있나 싶다.
.
.
Cannot assign value of type 'BookSearchViewController' to type '(any UISearchBarDelegate)?'
이번에는 UISearchBarDelegate
와 관련된 오류가 발생했다.
BookSearchViewController
에서 UISearchBarDelegate
를 채택하고, searchBar.delegate = self
를 설정하려 했는데,
self
가 BookSearchViewController
타입임에도 불구하고 위와 같은 오류가 발생했다.
문제는 BookSearchViewController
가 UIViewController
를 상속받고 있는데
그 자체가 UISearchBarDelegate
를 명시적으로 채택하지 않았기 때문이었다.
BookSearchViewController
는 UISearchBarDelegate
를 채택하도록 수정해야 했다.
class BookSearchViewController: UIViewController, UISearchBarDelegate {
}
UISearchBarDelegate
를 채택한 후에는 viewDidLoad
에서 searchBar.delegate = self
가 제대로 작동하긴 했다..
이렇게 delegate 관련 오류는 해결되었지만, 여전히 coreDataManager
전달 문제가 해결되지는 않았다.
.
.
viewModel
과 coreDataManager
를 BookSearchViewController
로 전달하는 방법처음에 BookSearchViewController
에서 viewModel
과 coreDataManager
를 전달하는 방법을 제대로 이해하지 못했다.
BookSearchViewController
는 viewModel
과 coreDataManager
를 초기화 매개변수로 받는데,
이걸 MainTabBarController
에서 어떻게 전달할지 확실히 알지 못했다.
BookSearchViewController
의 초기화 코드에서 viewModel
과 coreDataManager
를 제대로 전달하는 코드로 변경을 하긴 했는데
coreDataManager
를 싱글톤으로 잘못 사용하는 부분이 있지 않았는지 다시 한 번 보긴 했다.
그리고 BookSearchViewController
의 init
메서드에서 viewModel
과 coreDataManager
를 받아서 제대로 초기화하는 부분이 문제의 발단인 것 같은데
최종적으로 BookSearchViewController
를 제대로 초기화하기 위해서는 viewModel
과 coreDataManager
를 명시적으로 초기화하는 코드가 필요햇던 것 같다.
우선 아래와 같이 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")
}
}
이제 viewModel
과 coreDataManager
를 제대로 전달한 뒤에 BookSearchViewController
가 정상적으로 초기화가 되길 바랬지만
계속 fatalError가 생겼다.
이러한 과정에서 많은 시간이 걸렸고, 코드가 잘못 연결된 부분을 수정하는게 너무 힘들었다.
오늘은 Missing argument for parameter 'coreDataManager' in call
, Cannot assign value of type 'BookSearchViewController' to type '(any UISearchBarDelegate)?
와 같은 여러 오류를 해결하려 했지만, 여전히 몇 가지 문제를 해결하지 못한 상태다.
이 과정에서 느낀 점은 정확한 오류 메시지를 분석해보고 이를 해결할 수 있는 방법을 찾는데 있어서 인내와 반복적인 점검이 중요하다는 걸 좀 알게 됐다.
성격이 급해서 이건가? 이건가? 하고 바로 수정해봐도 어차피 제대로 알지 못한채 수정하니 되지 않는게 당연했으니까.
이런 각 오류의 원인을 정확하게 찾아내고, 해결하기 위한 코드를 작성하는 과정이 중요한데 어렵다.