swift - 避免字符串在 swift 中被视为可选
问题描述
我有一个函数,其中字符串值是根据字典中的值定义的。如果找不到字典中的值,我将其设置为静态字符串。字符串是常量(let
):
let dict = [ 1: "a",
2: "b" ]
func x() {
let index = someFunctionReturnsInt()
let str = (nil != dict[index]) ? dict[index] : "N/A"
所以字符串不可能是nil
。但是,当我尝试使用 时str
,Swift 仍然认为它是可选的。例如:
// still inside the same function
os_log("Str is %@", str)
将返回编译器错误:
可选类型“字符串?”的值 必须解包为“字符串”类型的值
问题是,我多次使用此功能,str ?? "N/A"
每次添加都没有意义。Force-unwrap withstr!
似乎有点矫枉过正:这个字符串对应用程序并不重要,所以我认为如果它丢失则中止执行没有任何意义。
那么 force-unwrap 是唯一的解决方案,还是有更好的方法将字符串定义为非可选且“永远不会为零”?
解决方案
问题是它dict[index]
仍然返回一个可选的,所以str
必须是一个可选的。有两种方法可以修复它
如果它不是 nil,则可以使用 nil 合并运算符使用dict[index]
,否则使用“N/A”
let str = dict[index] ?? "N/A"
另一种选择是使用字典默认值下标
let str = dict[index, default: "N/A"]
推荐阅读
- kubernetes-helm - Helm:在值 YAML 文件中使用变量
- elasticsearch - 来自容器化 WebApp 的日志不会通过 Serilog.Sinks.Elasticsearch 发送到 Elasticsearch
- python - 如何使用 google colab 在同一视频上创建第二个窗口
- laravel - Nginx 不显示页面 laravel
- android - 以编程方式显示/隐藏 TextInputLayout 底部笔划
- commercetools - 如何在 commercetools 项目中获取所有产品的变体数量?
- python-3.x - 如何遍历字典列表列表?
- matlab - 如何在群体优化的每次迭代中显示建立的最佳值 x(不是 f(X))
- postgresql - 如何从postgres中的时间戳中减去存储在列中的数值?
- mysql - 当我执行长查询时,Mysql 是否需要很长时间才能响应?