Swiftui 为什么@Binding属性每次都会导致不相关的init?

Swiftui 为什么@Binding属性每次都会导致不相关的init?,swiftui,combine,Swiftui,Combine,这是一个让我困惑了一整天的bug,我为我的案例做了一个演示,所有的只是一个列表和一个细节 房间。swift struct Room: Identifiable { var id: Int var name: String } class RoomListModel: ObservableObject { @Published var rooms: [Room] = [ Room(id: 1, name: "Room A"), Room(

这是一个让我困惑了一整天的bug,我为我的案例做了一个演示,所有的只是一个列表和一个细节

房间。swift

struct Room: Identifiable {

    var id: Int
    var name: String
}
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"),
    ]
}
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() )
        }
    }
}
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)
        }
    }
}
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)
    }
}
RoomListModel.swift

struct Room: Identifiable {

    var id: Int
    var name: String
}
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"),
    ]
}
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() )
        }
    }
}
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)
        }
    }
}
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)
    }
}
RoomList.swift

struct Room: Identifiable {

    var id: Int
    var name: String
}
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"),
    ]
}
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() )
        }
    }
}
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)
        }
    }
}
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)
    }
}
RoomRow.swift

struct Room: Identifiable {

    var id: Int
    var name: String
}
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"),
    ]
}
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() )
        }
    }
}
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)
        }
    }
}
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)
    }
}
但是当我触发RowDetail中的一个时,所有的RoomDetails都会被再次初始化,但我只会转到其中一个,而不是所有的,为什么所有的RoomDetails都会被初始化,然后再次

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

我不知道为什么,但找到了一个解决方案,我删除了所有@Binding属性,这没问题,但是为什么
@Binding
会导致未还原的初始化?

无法重现这个问题,使用Xcode 11.0和iOS 13一切都很好。@eloss我刚才检查过,Xcode是11.1,iOS是13.1,我上传了一个演示,请重试。