SwiftUI中如何显示结构体数组首个元素的名称与日期?
解决SwiftUI中显示数组首个Item属性的问题
你遇到的错误有两个核心原因:
items.first返回的是可选类型Item?,Text无法直接接收可选值;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š
相关产品推荐
相关产品推荐

