Swift 看似相同的if-let块之间的行为不一致
我的Swift 看似相同的if-let块之间的行为不一致,swift,if-statement,optional,Swift,If Statement,Optional,我的cellForRowAt函数中有此代码: if let modifiedDate = deliveryItem.modifiedDate?.toString(format: "M/d/yy"), let modifiedBy = deliveryItem.modifiedBy { cell.detailTextLabel?.text += " (MODIFIED: \(modifiedDate) BY: \(modifiedBy))" } 但它跳过了内行,即使这两个属性的值都不
cellForRowAt
函数中有此代码:
if let modifiedDate = deliveryItem.modifiedDate?.toString(format: "M/d/yy"), let modifiedBy = deliveryItem.modifiedBy {
cell.detailTextLabel?.text += " (MODIFIED: \(modifiedDate) BY: \(modifiedBy))"
}
但它跳过了内行,即使这两个属性的值都不是nil。一时兴起,我尝试将toString
调用移动到内行:
if let modifiedDate = deliveryItem.modifiedDate, let modifiedBy = deliveryItem.modifiedBy {
cell.detailTextLabel?.text += " (MODIFIED: \(modifiedDate.toString(format: "M/d/yy")) BY: \(modifiedBy))"
}
突然,它开始工作并产生预期的产出。就我所知,这两段代码在功能上似乎完全相同,所以我不明白为什么它第一次不起作用。我甚至试着在控制台中运行deliveryItem.modifiedDate?.toString(格式:“M/d/yy”)
,只是为了确保这一点,结果它返回了一个非零的值
下面是toString
函数,但我也没有看到任何会影响值展开的内容:
extension Date {
func toString (format: String?) -> String {
guard let format = format else {
return ""
}
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format
return dateFormatter.string(from: self)
}
}
应已传递的数据示例:
modifiedDate = (Date?) 2018-10-05 23:50:00 UTC
modifiedBy = (String?) "SC"
不相关,但向用户显示格式为
M/d/yy
的日期是一个非常糟糕的主意。许多用户会感到困惑。10/8/18
是什么意思?是2018年10月8日、2018年8月10日还是2010年8月18日?最好使用日期或时间样式向用户显示日期(和/或时间),不是硬编码格式。@rmaddy这是针对特定客户的格式,这是他们想要的格式。您能否给出deliveryItem.modifiedDate
和deliveryItem.modifiedBy
的示例,其中单元格.detailTextLabel?.text+=…
未执行?不相关,但为什么格式
参数是可选的?调用函数时,确实希望将日期转换为字符串,如果要传递nil
@Carpsen90,则在编译时会出现错误。vadian,它还用于另一个地方,其中格式来自外部源,如果缺少格式,则决定返回空字符串。