无法删除可选(“String”)。声明它是非选择性的

时间:2018-03-23 12:24:39

标签: swift optional

我正在开发一个花费跟踪器应用程序。 Al逻辑现在正在工作但是当我想在UILable中显示交易数据时,它将其显示为optional("String")

我已经浏览过互联网并试图以两种不同的方式展开字符串,但我无法修复它。

添加!到字符串的末尾会出现错误Cannot force unwrap value of non-optional type "String"

以下是我现在使用的代码,显示optional("String")

在这里我设置了我的结构和数组

struct Transaction {
    var discr = ""
    var amount = 0
}
var transactions = [Transaction]()

这是我向数组添加数据的方式

transactions.append(Transaction( discr: String(describing: transDescrInput.text), amount: Int(tempAmount)))

这就是我在tableview中显示数据的方式

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = transTable.dequeueReusableCell(withIdentifier: "sCell")
    let discrText = transactions[indexPath.row].discr.uppercased()
    cell?.textLabel?.text = "€\(transactions[indexPath.row].amount)"
    cell?.detailTextLabel?.text = "\(discrText)"

return cell!

}

这就是它在应用中的显示方式

Iphone simulator screenshot

3 个答案:

答案 0 :(得分:3)

问题已经存在于向阵列添加数据的位置。 假设transDescrInput.text是可选字符串,

String(describing: transDescrInput.text)

返回非可选字符串"Optional(text...)",并且有 没有明智的方法来恢复它。您应该使用可选绑定 或者其他展开机制,例如

if let text = transDescrInput.text {
    transactions.append(Transaction(discr: text, amount: Int(tempAmount)))
}

或使用nil-coalescing:

transactions.append(Transaction(discr: transDescrInput.text ?? "", amount: Int(tempAmount)))

根据经验,String(describing:)几乎永远不会正确 解决方案(即使编译器将其建议为Fix-it),它也只是隐藏 实际问题。

答案 1 :(得分:-1)

发布这篇文章后,我意识到在将文本添加到我的数组之前必须解开文本。所以我改变了保存字符串的方式:

transactions.append(Transaction( discr: String(describing: transDescrInput.text!), amount: Int(tempAmount)))

我加了一个!在我将它保存到我的数组之前,在transDescrInput.text后面展开它。

答案 2 :(得分:-2)

我可以建议做这样的事吗?

let discrText = transactions[indexPath.row].discr.uppercased()
cell?.detailTextLabel?.text = "\(discrText!)"