IOS/에러 해결

[iOS/Error] Xcode No exact matches in reference to static method 'buildExpression' 에러

버스트 캐넌 2024. 2. 7. 22:15

글 작성에 앞서 본 블로그의 모든 게시글은 블로그 주인의 개발 일지(일기) 형태의 게시글입니다.

정보를 나누는 방식보단, 제가 했던 방식을 공유하는 식의 글이라 읽어도 제대로 이해를 못 하실 수 있거나 더 좋은 다른 방법이 존재할 수 있습니다.

이 점 양해해 주시며 본 블로그의 게시글을 읽어주시면 감사하겠습니다.

 

 

안녕하세요 버스트캐넌입니다.

 

오늘은 iOS 앱 개발 하면서 Xcode에서 발생한 'No exact matches in reference to static method 'buildExpression'' 에러 관해 글을 작성해 봅니다.

 

1.  사건 발생

 

평화롭게 개발을 다 하고 빌드를 했는데, 건들지도 않았던 ContentView에 처음 보는 에러가 떴습니다.

 

'No exact matches in reference to static method 'buildExpression'' 라는 에러로, 컴파일러가 기대하는 타입이나 메서드를 찾을 수 없을 때 나타납니다.

 

쉽게 말하자면 아주 간단한 무언가를 놓쳐서 발생한 에러입니다.

 

 

경고창으로 여러 개가 떴으나, 각각 검색해 봐도 제 에러는 고쳐지지 못했습니다...

다만 'No exact matches in reference to static method 'buildExpression''의 에러를 다시 생각해 봤습니다.

 

'아주 간단한 무언가를 놓쳐서 발생한 에러'라고 생각해서 저는 ContentView를 다시 살펴봤습니다.

 

2.  원인 발견

원인은 진짜 간단했습니다.

 

저는 이 앱을 개발하면서 공부를 하기 위해 여러 기능을 넣어 보려고 했습니다. 그중 하나가 테마 기능입니다. 

 

 

홈뷰에서 선언한 isThemeGroupButton의 값을 Binding으로 들고 와서 색깔이 필요한 곳에 뿌려주는 식으로 코드를 작성했습니다.

isThemeGroupButton의 값이 0이면 라이트모드, 1이면 다크모드 같은 느낌으로요.

 

그러나 지금 현재 뷰가 SplashScreenView입니다.

SplashScreenView는 앱이 시작될 때 잠깐 나타났다가 사라지는 초기화면, 쉽게 말해 로딩화면이라고 생각하시면 됩니다.

저희 앱 제일 처음 보이는 HomeView의 화면이 Firebase에 있는 데이터를 나열하는 뷰인데, Firebase와의 통신 시간이 살짝 걸리게 됩니다. 그렇기 때문에 불러오는 시간을 고려하여 로딩화면인 SplashScreenView를 생각했고 구현했습니다.

 

처음 구현에는 하드코딩으로 해서, 구현되는지만 확인했고 이때까지는 빌드는 잘 되었으나, 테마를 적용하기 위해 코드를 수정하다가 No exact matches in reference to static method 'buildExpression'' 라는 에러가 떴습니다. 이제 왜 에러가 뜬 지 얼추 나왔죠?

 

 

SplashScreenView는 앱의 메인 콘텐츠가 뜨기 전에 잠시 나타났다가 사라지는 뷰로, 저희 앱의 메인 뷰인 TabView 밖에 위치합니다.

 

앱을 맨 처음 실행할 때의 순서도를 설명하자면

(로딩을 해야 한다면) SplashScreenView 보여주기 -> (로그인이 안되어있다면) LoginView (로그인이 되었는데 유저 정보가 없으면) NicknameView -> (로그인이 되었고 유저 정보가 있다면) TabView입니다.

 

즉, SplashScreenView가 가장 먼저 실행되는 뷰라고 보시면 됩니다.

그러나 SplashScreenView에 있는 isThemeGroupButton를 TabView안의 HomeView에 선언을 해두었기에 HomeView가 실행되어야 isThemeGroupButton 값이 생기는데, SplashScreenView를 먼저 띄워야 하다보니 isThemeGroupButton의 초기값이 없어서 에러가 난 것이었습니다. (아니 이럴 거면 SplashScreenView에 에러가 뜨지 왜 괜한 TabView에 떠서 삽질을 하게 만드냐...)

 

이것은 간단하게 해결 가능합니다. isThemeGroupButton를 더 상위뷰(부모뷰)인 ContentView에 선언하면 됩니다.

 

3.  해결 완료

 

홈뷰에 선언한 isThemeGroupButton을 cmd + x (잘라내기) 해서,

 

ContentView에 선언해 두었습니다. 

그리고 상위뷰(부모뷰)에 선언한 변수를 하위뷰(자식뷰)에 잘 사용하기 위해 적절히 코드를 수정해 줍니다.

 

 

@AppStorage로 선언했던 isThemeGroupButton를 ContentView에서 받아와야 하니까 적절히 @Binding을 하였습니다.

 

 

그리고 @Binding 한 변수를 제대로 불러올 수 있게 하기 위해 HomeView와 SplashScreenView에 적절히 코드를 수정하였습니다.

 

개발자들 기분좋아지는 짤.png

 

다행히 성공적으로 빌드가 되었습니다.

 

다시 간단히 요약하자면 'No exact matches in reference to static method 'buildExpression''의 에러의 범위는 상당히 광범위해서, 정확히 어디서 발생하진 않았지만 어디선가에서 아주 간단한 무언가를 놓쳐서 발생한 에러입니다.

 

저의 경우를 요약하자면 초기 변수값이 정해지지 않아 발생한 에러였습니다.

 

혹시 이 글을 읽으신 분들 중에 저와 같은 에러가 발생했다면,

앱을 실행하는 ContentView에서 최초로 실행되는 뷰부터 확인해 보면서,

사용되는 변수 중에 초깃값이 정해지지 않은 변수가 있는지 확인해 보시길 바랍니다.

 

코드로 간단하게 설명 후 포스팅 마치겠습니다.

좋은 하루 보내세요~

 

// ContentView
SplashScreenView()
// SplashScreenView -> error : 초기값이 없음
@Binding var isThemeGroupButton: Int

// ContentView
@AppStorage("isThemeGroupButton") private var isThemeGroupButton: Int = 0
SplashScreenView(isThemeGroupButton: $isThemeGroupButton)
// SplashScreenView -> Build succeeded
@Binding var isThemeGroupButton: Int

 

궁금한 점이나 지적해야 할 부분이 있으시면 댓글 남겨주세요. 블로그 주인의 상황에 따라 답변이 없을 수 있으나, 최대한 피드백해 드리겠습니다.