Swift 中的顶部栏

TopBar in Swift

我正在学习 swift 但我遇到了问题。 我想制作一个覆盖整个屏幕顶部的顶部栏。现在的问题是我有一个我不明白的错误:“可选类型 'CGFloat?' 的值必须解包为 'CGFloat' 类型的值”

我想得到帮助提前谢谢你

import Foundation

struct ContentView: View {
    var body: some View {
        VStack{
            TopBar()
            Spacer()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
struct TopBar : View {
    var body : some View{

        VStack(spacing: 20){
            HStack{
                Text("News").font(.system(size: 20)).fontWeight(.semibold).foregroundColor(.white)
                
                Spacer()

            }
        }.padding()
        .padding(.top, UIApplication.shared.windows.last?.safeAreaInsets.top + 10) //line with error : Value of optional type 'CGFloat?' must be unwrapped to a value of type 'CGFloat'
        .background(Color("Color"))
    }
}```

当你使用 .last? 时,问号意味着 last 可能不存在——所以,你最终得到一个可选的 (CGFloat?) 而不是 (non-optional ) CGFloat.

如果您的原始值为 nil,您可以使用 nil 合并(?? 运算符 -- https://www.hackingwithswift.com/example-code/language/what-is-the-nil-coalescing-operator)提供默认值:

.padding(.top, (UIApplication.shared.windows.last?.safeAreaInsets.top ?? 0) + 10) 

但是,您应该知道 SwiftUI 会为您填充安全区域——您实际上不需要自己做。如果你想在安全区域插图下方有 10 磅的顶部填充,只需使用 .padding(.top, 10)

根据评论更新

struct TopBar : View {
    var body : some View {
        VStack(spacing: 20) {
            HStack{
                Text("News").font(.system(size: 20)).fontWeight(.semibold).foregroundColor(.white)
                Spacer()
            }
        }
        .background(Color.red.edgesIgnoringSafeArea(.top))
    }
}