【问题标题】:How would I display a text that shows an array in SwiftUI如何在 SwiftUI 中显示显示数组的文本
【发布时间】:2021-07-21 03:27:43
【问题描述】:

我有一个日期数组

let Dates = ["2021-01-07","2021-01-19"]

我想在 Text 中将它们显示为刺痛

Text("\(Dates)")

但是我不断收到错误

Cannot call value of non-function type '[String]'.

我想知道这样做是否可以在 swiftUI 中实现。

我也想知道我是否可以以格式显示今天的日期

YYYY-MM-DDT00:00:00Z.

【问题讨论】:

    标签: xcode swiftui xcode12


    【解决方案1】:
    1. 在 Swift 中,变量名通常是小写的:
    let dates : [String] = ["2021-01-07","2021-01-19"]
    
    1. 要以Text 的形式显示这些内容,您需要将[String] 转换为String。一种可能性是:
    Text(dates.joined(separator: ", "))
    
    1. 如果您希望它们采用不同的格式,则需要将 String 转换为 Date
    struct ContentView: View {
        @State private var formatterIn = DateFormatter()
        @State private var formatterOut = ISO8601DateFormatter()
        let dates : [String] = ["2021-01-07","2021-01-19"]
        
        var datesToNewFormat : String {
            formatterIn.dateFormat = "yyyy-MM-dd"
            return dates.compactMap { formatterIn.date(from: $0) }.map { formatterOut.string(from: $0)}
                .joined(separator: ", ")
        }
        
        var body: some View {
            VStack {
                Text(dates.joined(separator: ", "))
                Text(datesToNewFormat)
            }
        }
    }
    

    请注意最后一项,它也处理时区转换。在您的示例中,如果您想要 T00:00:00Z最简单的事情就是将其附加到原始字符串的末尾:

    dates.map { $0 + "T00:00:00Z" }
    

    或者,您可以使用 DateComponents 手动将小时设置为零。这一切都可能取决于您的输入来自哪里以及您对输出的意图是什么。

    值得一提的是,SwiftUI 有一些内置工具,用于在Text 中显示Date。见https://www.hackingwithswift.com/quick-start/swiftui/how-to-format-dates-inside-text-views

    【讨论】:

      【解决方案2】:

      我想知道这样做是否可以在 swiftUI 中实现。

      绝对!

      struct ContentView: View {
          let dates = ["2021-01-07", "2021-01-19"]
          
          var body: some View {
              VStack {
                  Text("Today is \(todayDate())")
                  
                  ForEach(dates, id: \.self) { date in
                      Text("\(date)")
                  }
              }
          }
          func todayDate() -> String {
              
              let dateFormatter = DateFormatter()
              dateFormatter.dateFormat = "YYYY-MM-DDT00:00:00Z"
              
              let today = Date() /// Date() is the current date
              let todayAsString = dateFormatter.string(from: today)
              return todayAsString
          }
      }
      

      结果:

      请注意,"YYYY-MM-DDT00:00:00Z" 日期格式会生成 2021-04-1170。您可能想要2021-04-27T11:56:55-0700 之类的东西。在这种情况下,做

      dateFormatter.dateFormat = "YYYY-MM-d'T'HH:mm:ssZ"
      

      '' 包含您要添加的自定义字符,例如 T。对于其他格式字符,请查看this website

      【讨论】:

      • 如何只显示 1 个日期?像打印(日期(0))?这行得通吗?
      • @JonathanSoliman 如果您只想要第一个日期,只需将整个 ForEach 块替换为 Text("\(dates[0])")(使用方括号 [] 访问索引处的元素)。或者您想将所有日期组合成 1 个字符串?查看@jnpdx 的Text(dates.joined(separator: ", "))
      • 如果我可以将小时分钟和秒默认设置为0,是否有可能?我试图找出两个日期之间的差异,它给了我一个小数
      • @JonathanSoliman 查看this - 您应该按日期组件比较日期(例如daymonth
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2020-03-28
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多