SwiftUI 地图 - 无法在 属性 初始值设定项中使用实例成员; 属性 初始值设定项 运行 在 'self' 可用之前

SwiftUI Maps - Cannot use instance member within property initializer; property initializers run before 'self' is available

我正在尝试将 MapKit 的地图与 SwiftUI 和动态 latitude/longitude 值一起使用,这些值由导航堆栈上的父视图传递到视图中。 Swift 的所有 MapKit 文档都表明您需要将 @State 与 MKCoordinateRegion 一起使用,但始终将其与常量 latitude/longitude 值一起使用。

struct PlaceDetail: View {
    let place: Place
    
    @State private var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: place.latitude, longitude: place.longitude),
        latitudinalMeters: 750,
        longitudinalMeters: 750
    )
    
    var body: some View {
        Map(coordinateRegion: region)
    }
}

我希望能够通过父视图传入的 place 对象提供的 latitude/longitude 值动态地使用它。上面的代码导致编译器错误:

Cannot use instance member 'place' within property initializer; property initializers run before 'self' is available

使此视图按预期编译和工作的 cleanest/most 更新方法是什么?


编辑:我曾尝试使用初始化程序,但最终遇到了另一个与针对状态分配相关的错误:

struct PlaceDetail: View {
    let place: Place
    
    @State var region: MKCoordinateRegion
    
    init(place: Place) {
        self.place = place
        
        let region = MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: place.latitude, longitude: place.longitude),
            latitudinalMeters: 750,
            longitudinalMeters: 750
        )
        
        self.region = State(initialValue: region)
    }
    
    var body: some View {
        Map(coordinateRegion: $region)
    }
}

结果:

Cannot assign value of type 'State<MKCoordinateRegion>' to type 'MKCoordinateRegion'

我在最后的编辑中接近了,但我需要分配值 _region - 而不是带前缀的下划线。看起来这是一个私有 setter,这就是为什么您需要将值包装在 State 中。并且不要忘记使用 $ 前缀在视图中使用实例变量。

struct PlaceDetail: View {
    let place: Place
    
    @State var region: MKCoordinateRegion
    
    init(place: Place) {
        self.place = place
        
        let region = MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: place.latitude, longitude: place.longitude),
            latitudinalMeters: 750,
            longitudinalMeters: 750
        )
        
        self._region = State(initialValue: region)
    }
    
    var body: some View {
        Map(coordinateRegion: $region)
    }
}