You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何显示结构体数组首个元素的名称与日期?

解决SwiftUI中显示数组首个Item属性的问题

你遇到的错误有两个核心原因:

  1. items.first 返回的是可选类型 Item?,Text无法直接接收可选值;
  2. Text的初始化器要求输入符合StringProtocol的类型,Item结构体本身不是字符串,必须访问它的具体属性(name/date)。

解决方案

在else代码块中,先获取数组的首个元素(因为已经通过items.isEmpty判断数组非空,所以可以安全解包),然后分别显示它的name和格式化后的date属性:

完整代码示例(iOS15+)

struct Item: Identifiable {
    var name: String
    let date: Date
    let id = UUID()
}

struct ContentView: View {
    @State private var items = [Item]()
    
    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                
                Text("First item:")
                if items.isEmpty {
                    Spacer()
                    Text("No items, go find some!")
                        .font(.largeTitle)
                } else {
                    // 获取首个元素
                    let firstItem = items.first!
                    
                    VStack(alignment: .leading, spacing: 8) {
                        Text("Name: \(firstItem.name)")
                            .font(.title)
                        
                        // 使用系统内置的日期格式化(iOS15+)
                        Text("Date: \(firstItem.date.formatted(date: .long, time: .shortened))")
                            .font(.subheadline)
                            .foregroundColor(.secondary)
                    }
                }
                
                Spacer()
            }
        }
    }
}

兼容iOS15以下版本的写法

如果需要支持更低版本iOS,可自定义DateFormatter:

struct ContentView: View {
    @State private var items = [Item]()
    
    // 自定义日期格式化器
    private static let dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .long
        formatter.timeStyle = .short
        return formatter
    }()
    
    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                
                Text("First item:")
                if items.isEmpty {
                    Spacer()
                    Text("No items, go find some!")
                        .font(.largeTitle)
                } else {
                    let firstItem = items.first!
                    
                    VStack(alignment: .leading, spacing: 8) {
                        Text("Name: \(firstItem.name)")
                            .font(.title)
                        
                        Text("Date: \(Self.dateFormatter.string(from: firstItem.date))")
                            .font(.subheadline)
                            .foregroundColor(.secondary)
                    }
                }
                
                Spacer()
            }
        }
    }
}

补充说明

如果想更严谨(避免极端情况的崩溃),也可以在else块中用if let再次确认首个元素存在:

else {
    if let firstItem = items.first {
        // 显示属性的代码
    }
}

不过因为已经通过items.isEmpty判断数组非空,所以这种写法更多是锦上添花。

内容的提问来源于stack exchange,提问作者Viktor Goleš

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:25:21