SwiftUI에서 바인딩 매개변수를 일반 타입의 값으로 넘기기

Swift // 2024년 07월 16일 작성

SwiftUI로 뷰를 만들다 해당 뷰를 테스트 해야 할 일이 있을 수 있다. 예를 들자면 프리뷰(SwiftUI Preview)용 코드를 작성할 때 등등 말이다. 그래서 시험용으로 몇몇 변수의 값을 하드코딩으로 넘기는 경우도 허다할 것이다.

그런데 이런 경우 아래와 같은 형식의 오류를 종종 볼 수 있다.

Cannot convert value of type 'FooBar' to expected argument type 'Binding<FooBar>'

직역하면 특정 타입의 값을 원하는 바인딩 타입으로 변환할 수 없다라는 의미다. 참고로 FooBar로 표기한 부분에는 실제로 사용된 타입이 표시되는 부분이니 오해하지 말자. 사용하는 타입에 따라 메시지는 당연히 바뀔 것이다.

어쨌거나 이 오류의 원인은 @Binding 등으로 표기된 프로퍼티의 값으로 넘겨야 할 값을 그냥 정적인 값으로 넘겼기 때문에 발생한다.

따라서 해결 방법 중 가장 직관적인(?) 방법은 넘기려는 값을 @State 등의 프로퍼티로 생성해서 바인딩 가능하게 넘기는 방법이 있을 것이다. 물론 그게 귀찮으니 이런 글이 탄생했지만 말이다.

그 외에 가장 간단한 해결 방법

이럴 때를 위해 Binding.constant가 제공된다. 어려울 것 없이 넘기려는 값을 매개변수로 넣어서 '바인딩 타입으로 값을 한번 감싸서 전달'하는 식이다.

MyViewController(name: .constant("Temporary Name"))

그렇게 하면 간단하게 해결된다.

물론 이렇게 하면 SwiftUI 특유의 바인딩의 제대로 된 기능을 활용하지 못 한다는 점을 기억하자. 단순히 테스트 혹은 프리뷰 용도로만 활용하기엔 괜찮은 방법 같다.