如何检查数组中有多少项并将它们中的每一项分配给 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"
}
关于你的第二个问题,你不能UILabel
到String
。您将必须像我之前的示例代码中那样在 UILabel
上使用 .text
属性。
所以self.dayLabels[days]
应该是self.dayLabels[days].text
我有一个天气应用程序,它有一个堆栈来显示带有 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"
}
关于你的第二个问题,你不能UILabel
到String
。您将必须像我之前的示例代码中那样在 UILabel
上使用 .text
属性。
所以self.dayLabels[days]
应该是self.dayLabels[days].text