Swift 运行 Xcode 11 使用 SwiftUI 时的编译器问题

Swift compiler issue when running Xcode 11 using SwiftUI

我正在尝试获取我的 SwiftUI 演示 运行,但我遇到了奇怪的编译器问题:

'Color' is not convertible to 'Color?'

Unable to infer complex closure return type; add explicit type to disambiguate

struct LandmarkRow: View {
  var landmark: Landmark
    
  var body: some View {
    HStack {
      landmark.image(forSize: 50)
      Text(landmark.name)
      Spacer()
    
      if landmark.isFavorite {
        Image(systemName: "star.fill")
           .imageScale(.medium)
           .foregroundColor(.yellow) // Here 'Color' is not convertible to 'Color?'
      }
    }
  }
}

struct LandmarkList: View {
  @State var showFavoritesOnly = true
    
  var body: some View {
      NavigationView {
          List {
              Toggle(isOn: $showFavoritesOnly) {
                  Text("Favorites only")
              }
    
              ForEach(landmarkData) { landmark in // Here Unable to infer complex closure return type; add explicit type to disambiguate
                  if !self.showFavoritesOnly || landmark.isFavorite {
                      NavigationButton(destination: LandmarkDetail(landmark: landmark)) {
                          LandmarkRow(landmark: landmark)
                      }
                  }
              }
              .navigationBarTitle(Text("Landmarks"))
          }
      }
   }
}

目前,Swift 编译器生成的错误消息可能与实际问题所在的位置有一定距离。我们被鼓励就此类问题提交雷达。

在这种情况下,我可以看到您在创建第一个 Text() 时缺少 verbatim: 参数名称:

    var body: some View {
        HStack {
            landmark.image(forSize: 50)
            Text(verbatim: landmark.name) // don't forget the "verbatim" parameter name
            Spacer()

            if landmark.isFavorite {
                Image(systemName: "star.fill")
                    .imageScale(.medium)
                    .foregroundColor(.yellow)
            }
        }
    }

...但是我无法通过删除它来重现您看到的编译器错误。因此,我建议您仔细比较已完成的项目文件,您可以从教程页面下载这些文件。

编辑:看起来其他人也有同样的问题 - 您可以在这里找到答案:(查看 Landmark 上的 isFavourite 属性)。

嗯...这与 isFavorite 属性 它在 Landmark 文件中丢失有关。 (少了‍♂️)

所以我要填补一个关于这个错误的编译器消息的错误。这绝对是一个错误。雷达编号FB6118410

如果你想修复它,你需要做两件事: 1

  1. 将此添加到 Landmark 结构 var isFavorite: Bool
  2. 您需要编辑 landmarkData.json 并添加此键和值 "isFavorite": true 否则它会崩溃。