SwiftUI NavigationLink给地图标注跳转的siteView传参报错如何解决?
问题原因
报错是闭包参数作用域冲突导致的:Map(coordinateRegion:annotationItems:) 给annotationItems传入的尾随闭包会接收当前遍历的Site实例作为唯一参数,你原本用隐式参数$0取这个值,但内层MapAnnotation的尾随闭包是无参数的,你在NavigationLink里写的$0会被识别为内层闭包的参数,自然就触发了「期望0参数却使用了1个参数」的报错。
解决方法
给外层annotationItems闭包的参数显式命名,明确你要传递的Site实例来源即可,修改后的siteMapView代码如下:
struct siteMapView: View { @EnvironmentObject var siteData: siteData @State private var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 51.507222, longitude: -0.1275), span: MKCoordinateSpan(latitudeDelta: 10, longitudeDelta: 10)) var body: some View { NavigationView { // 这里给闭包参数显式命名为site,明确是当前遍历的点位实例 Map(coordinateRegion: $region, annotationItems: siteData.sites) { site in MapAnnotation(coordinate: site.locationCoordinate, anchorPoint: CGPoint(x: 0.5, y: 0.5)) { NavigationLink { // 直接用显式命名的site参数传入,不会再出现作用域冲突 siteView(site: site) } label: { Circle() .strokeBorder(Color.green, lineWidth: 10) .frame(width: 44, height: 44) } } } .edgesIgnoringSafeArea(.top) } } }
额外优化建议
按照Swift官方编码规范,所有自定义类型(结构体、类、枚举)的命名需要用大驼峰形式,建议你把siteView改成SiteView、siteData改成SiteData,避免后续出现其他编译识别问题。
内容的提问来源于stack exchange,提问作者user1465078
相关产品推荐
相关产品推荐

