iOS支出追踪App显示Optional("String")问题求助
解决UILabel显示Optional("String")的问题
这个问题的根源出在你处理输入框文本的方式上,咱们一步步拆解和解决:
为什么会出现Optional("String")?
你用了String(describing: transDescrInput.text)来转换输入框的文本,但transDescrInput.text是可选字符串类型(String?),String(describing:)这个方法的作用是把任意类型转换成它的"描述性字符串"——对于可选值来说,它会直接把Optional("你的输入内容")整个作为字符串存到discr里,而不是帮你解包出里面的真实内容。
之后你尝试用!解包discr报错,是因为你的Transaction结构体里discr定义的是非可选的String类型(默认值是空字符串),它本身就不是可选值,自然不能强制解包。
正确的解决方案
修改你向数组添加数据的代码,用安全的方式处理可选的输入文本:
方式1:用空合运算符(??)给默认值
如果输入框为空,就用空字符串替代,同时金额转换也建议加容错:
// 安全处理输入框文本,为空则用空字符串 let descr = transDescrInput.text ?? "" // 处理金额转换失败的情况,比如输入非数字时用0替代 let amount = Int(tempAmount) ?? 0 transactions.append(Transaction(discr: descr, amount: amount))
方式2:用可选绑定做严谨校验
如果需要严格确保输入有效才添加交易,可以用可选绑定:
// 同时校验输入文本不为空、金额转换成功 if let descr = transDescrInput.text, !descr.isEmpty, let amount = Int(tempAmount) { transactions.append(Transaction(discr: descr, amount: amount)) } else { // 这里可以加提示,比如告诉用户输入有效的交易描述和金额 }
验证效果
修改完添加数据的代码后,你的表格视图代码不需要改动——因为现在transactions数组里的discr已经是纯字符串了,discr.uppercased()会直接输出真实的交易描述,不会再带Optional()包裹。
内容的提问来源于stack exchange,提问作者Laurence De Wilde
相关产品推荐
相关产品推荐

