SwiftUI Map报错Type '()' cannot conform to 'MapAnnotationProtocol'求解
问题原因
- 报错的核心是你给
annotationItems传入的闭包返回值类型不统一:当meal.latitude或longitude为0时,if条件不成立,闭包没有返回任何符合MapAnnotationProtocol的实例,而是返回了空值(),所以触发了类型不匹配的错误。 - Demo可以正常运行是因为你的Demo测试数据中所有条目经纬度都不为0,if判断永远为真,闭包永远返回
MapPin实例,不会触发空返回的分支。你尝试用Group{}包裹没有生效,本质是没有解决「条件不成立时无有效返回值」的问题。
修复方案
最优解法是提前过滤数据源,只将经纬度合法的条目传给Map的annotationItems,不要在注解生成闭包内做条件判断,修改后的代码如下:
import SwiftUI import MapKit struct MapLocationView: View { @ObservedObject var manager = LocationManager() @FetchRequest(sortDescriptors: []) private var meals: FetchedResults<Meal> var body: some View { // 提前过滤掉经纬度为0的无效条目 Map(coordinateRegion: $manager.region, annotationItems: meals.filter { $0.latitude != 0 && $0.longitude != 0 }) { meal in let coordinate = CLLocationCoordinate2D(latitude: meal.latitude, longitude: meal.longitude) MapPin(coordinate: coordinate) } } }
如果确实需要在闭包内做条件判断,必须保证所有分支都有符合MapAnnotationProtocol的返回值,可在else分支返回EmptyMapAnnotation()占位。
内容的提问来源于stack exchange,提问作者Rob Hoover
相关产品推荐
相关产品推荐

