Swift의 바인딩 내에서 선택적 값을 줄 바꿈하려면 어떻게해야합니까?


9

SwiftUI를 사용하여 앱을 작성 중이며 Binding<Value?> A와를 Binding<Value>.

내 응용 프로그램 AvatarView에는 특정 사용자의 이미지를 렌더링하는 방법을 알고 있습니다.

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

내 응용 프로그램에는 ContentViewID별로 사용자 사전과 아바타를 표시 해야하는 사용자의 ID가 있습니다.

struct ContentView: View {
  @State var userById: Dictionary<Int, UserData>
  @State var activeUserId: Int

  var body: some View {
    AvatarView(userData: $userById[activeUserId])
  }
}

문제 : 위의 코드는 $userById[activeUserId]유형 Binding<UserData?>이며 AvatarViewa를 사용 하기 때문에 결합되지 않습니다 Binding<UserData>.

내가 시도한 것들 ...

  • $userById[activeUserId]!의 포장을 풀려고하기 때문에 작동하지 않습니다 Binding<UserData?>. 당신은 단지 랩을 해제 할 수 Optional는 아니고를 Binding<Optional>.

  • $(userById[activeUserId]!)아직 이해하지 못하는 이유로 작동하지 않지만 $컴파일 타임에 무언가 가 해결되어 임의의 표현식 앞에 접두사를 사용할 수 없다고 생각합니다 $.


시도 했습니까 $userById[activeUserId] as! Binding<UserData>?
Kamran

제안 해 주셔서 감사합니다! 아마 잘 작동 할 것이라고 생각하지만 안전하지 않은 캐스트를 선호하지 않습니다. 시도하면 "Binding <UserData?>에서 관련되지 않은 Binding <UserData> 유형으로 전송"이라는 빌드 경고가 표시됩니다.
rjkaplan

답변:


10

당신이 사용할 수있는 이 initialiser 이 정확한 경우를 처리하는 것, - 변환 Binding<T?>에를 Binding<T>?:

var body: some View {
    AvatarView(userData: Binding($userById[activeUserId])!)
}

나는 !당신의 시도와 마찬가지로 포장 풀기를 강제로 사용 했지만 nil원하는대로 포장을 풀 수 있습니다. 표현식Binding($userById[activeUserId]) 은 유형 Binding<UserData>?입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.