为不是字符串的 UItextfield / UIlabel 分配一个可选值

Assign an optional value to a UItextfield / UIlabel which aren't a string

我有一个应用程序,俱乐部 -> 会员 -> 交易,是分层的。 现在我想实现这个功能,例如编辑一笔交易的金额。交易的原因并不难,但我不能将可选类型 Double? 分配给 textfieldlabel.

所以我的问题是:如何将其分配给它?/如何将其转换为字符串?

向我显示此错误:Cannot invoke initializer for type 'String' with an argument list of type '(Double?)/(Date?)'

这是我的代码:

reasonlbl.text = transaction?.reason
dateLbl.text = String(transaction?.date)
amountLbl.text = String(transaction?.money)
amountLbl.text = String(format: "%f", transaction?.money)

日期也会发生类似的转换。

要将数字转换为字符串,您可以使用 NumberFormatter (documentation) 它们是一个了不起的对象,因为它们不仅将数字转换为文本,反之亦然,而且它们还采用考虑到用户设备上的当前语言环境,例如他们修改小数点分隔符。
对于相同的日期,您应该使用 DateFormatter(documentation).

let formatter = NumberFormatter()
formatter.numberStyle = .currency
amountLbl.text = formatter.string(from: transaction!.money) 

let dateFormatter = DateFormatter()
 dateFormatter.dateStyle = .medium
 dateLbl.text = dateFormatter.string(from: transaction!.date)

请注意,您的 transaction 对象使用了强制解包,但您必须处理正确的解包,否则它会崩溃。

你可以试试

if let money = transaction?.money {
    amountLbl.text = "\(money)"
}

//

if let date  = transaction?.date {
  let formatter = DateFormatter()
  formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" // set it as your format
  dateLbl.text = formatter.string(from:date)
}

理想情况下,您需要在执行此操作之前进行安全检查,如下所示:

guard transaction = transaction else {
  return
}

if let date = transaction.date {
...your code
}

如果你愿意,你也可以在交易对象为空的情况下分配默认值

let date = transaction?.date ?? Date()

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd 'at' HH:mm"

let dateString = formatter.string(from: date)

另一种方法如下:

amountLbl.text = "\(transaction?.money ?? 0)"