如何检查数组中有多少项并将它们中的每一项分配给 Swift 中的标签?

How can I check how many itens I have in an array and assign each one of them to a label in Swift?

我有一个天气应用程序,它有一个堆栈来显示带有 8 个标签的 8 天预报,每天一个标签,并且此数据来自 json 数据创建的数组。有时 API returns 不到 8 天,应用程序崩溃并出现致命错误:索引超出范围。

你能帮我找到一种方法,例如检查从 API 收到了多少天,并只为每个标签分配收到天数的日期,然后将“N/A”到没有数组数据的标签中?

欢迎提出任何其他建议。

下面我的ViewController错误发生的地方和转换日期只得到日期的函数:

@IBOutlet weak var day1Label: UILabel!
@IBOutlet weak var day2Label: UILabel!
@IBOutlet weak var day3Label: UILabel!
@IBOutlet weak var day4Label: UILabel!
@IBOutlet weak var day5Label: UILabel!
@IBOutlet weak var day6Label: UILabel!
@IBOutlet weak var day7Label: UILabel!
@IBOutlet weak var day8Label: UILabel!

        ...

        self.day1Label.text = dtString(dt: weather.dailyArray[0].dt)
        self.day2Label.text = dtString(dt: weather.dailyArray[1].dt)
        self.day3Label.text = dtString(dt: weather.dailyArray[2].dt)
        self.day4Label.text = dtString(dt: weather.dailyArray[3].dt)
        self.day5Label.text = dtString(dt: weather.dailyArray[4].dt)
        self.day6Label.text = dtString(dt: weather.dailyArray[5].dt)
        self.day7Label.text = dtString(dt: weather.dailyArray[6].dt)
        self.day8Label.text = dtString(dt: weather.dailyArray[7].dt)

        ...

        func dtString(dt: Double) -> String {
            let df = DateFormatter()
            df.locale = NSLocale.current
            df.dateFormat = "dd"
            let day = Date(timeIntervalSince1970: dt)
            let dayString = df.string(from: day)
            return dayString
        }

更新:

我创建了一个 Outlet 数组,我一直在寻找类似下面的东西,让数组中的每个值在 for 循环中分配给每个标签,但出现了另一个问题。

...

@IBOutlet private var dayLabels: [UILabel]!

...

        let days = weather.dailyArray.count
        
        for days in weather.dailyArray {
            self.dayLabels[days] = dtString(dt: weather.dailyArray[days].dt)
        }
        self.dayLabels[0].text = dtString(dt: weather.dailyArray[0].dt)

error message

固定:

...

@IBOutlet 私有变量 dayLabels: [UILabel]!

...

        func dtString(dt: Double) -> String {
            let df = DateFormatter()
            df.locale = NSLocale.current
            df.dateFormat = "dd"
            let day = Date(timeIntervalSince1970: dt)
            let dayString = df.string(from: day)
            return dayString
        }

...

       let totalDays = weather.dailyArray.count
        
        for days in 0...totalDays - 1 {
            self.dayLabels[days].text = dtString(dt: weather.dailyArray[days].dt)
        }

...

count获取数组的长度:

let days = weather.dailyArray.count

然后检查索引是否超出范围:

if days > 7 {
  self.day8Label.text = dtString(dt: weather.dailyArray[7].dt)
} else {
  self.day8Label.text = "N/A"
}

关于你的第二个问题,你不能UILabelString。您将必须像我之前的示例代码中那样在 UILabel 上使用 .text 属性。

所以self.dayLabels[days]应该是self.dayLabels[days].text