Почему свойство @Binding каждый раз вызывает не освобожденный init? - PullRequest
0 голосов
/ 12 октября 2019

Это ошибка, смущающая меня на весь день, я делаю демо для моего случая, все это просто список и детали.

Room.swift

struct Room: Identifiable {

    var id: Int
    var name: String
}

RoomListModel.swift

class RoomListModel: ObservableObject {
    @Published var rooms: [Room] = [
        Room(id: 1, name: "Room A"),
        Room(id: 2, name: "Room B"),
        Room(id: 3, name: "Room C"),
    ]
}

RoomList.swift

struct RoomList: View {

    @ObservedObject var model = RoomListModel()

    var body: some View {

        NavigationView {
            List {
                ForEach(model.rooms.indices) { index in
                    RoomRow(room: self.$model.rooms[index])
                }
            }
            .listStyle( GroupedListStyle() )
        }
    }
}

RoomRow.swift

struct RoomRow: View {

    @Binding var room: Room

    init(room: Binding<Room>) {
        print("initing RoomRow: " + room.name.wrappedValue)
        self._room = room
    }

    var body: some View {
        NavigationLink(
            destination: RoomDetail(room: $room)
        ) {
            Text(room.name)
        }
    }
}

RoomDetail.swift

struct RoomDetail: View {

    @Binding var room: Room

    init(room: Binding<Room>) {
        print("initing RoomDetail: " + room.name.wrappedValue)
        self._room = room
    }

    var body: some View {
        Text(room.name)
    }
}

Для удобства я добавляю печать в init.

При загрузке списка все RoomRow и RoomDetailэто нормально.

initing RoomRow: Room A
initing RoomDetail: Room A
initing RoomRow: Room B
initing RoomDetail: Room B
initing RoomRow: Room C

Но когда я запускаю один из RowDetail, все RoomDetails снова включаются, но я просто иду к одному, а не ко всем, WHY все RoomDetails инициализируются, и ОПЯТЬ ?

initing RoomDetail: Room C
initing RoomDetail: Room A
initing RoomDetail: Room B

Я не знаю почему, но нашел одно решение, я удалил все свойство @Binding, и все нормально, но ПОЧЕМУ @Binding вызовет непересоединенный init?

...