是否应该使用可选映射?
在 Swift-Evolution 中有个关于如何简洁地用一个可选值作为 key 获取字典的 value 的讨论: let dict: [SomeType: ...] = ... let key: SomeType? = someCall() let value = dictionary[key] but only if key is non-nil Dave Abrahams 指出,标准的查询格式应该是这样的: // if let value = key.map({ dict[$0] }) {...} // 错误! if let value = key.flatMap({dict[$0]}) {...} // 感谢 @oisdk // 这个 gist (https://gist.github.com/oisdk/4c40958d341952fde5af) 指出了 map 和 flatMap 的区别 这种方法使用了可选映射(Optional mapping)(译者注:关于 map 和 flatMap 的区别,可以参考之前的文章:Swift:map 和 flatMap 基础入门,返回一个非可选类型,即是 当我为写法简单而鼓掌时,我不禁想到下面多步的做法(更加复杂)相对来说可能会在效率上有所损失: if let key = key,value = dict[key] {...} 这个复合的 if-let 语句先将可选键值绑定,再在第二个小句中去进行查找对应值。和之前使用可选映射的功能并无区别,但是意义上更加清晰了。至少对我而言是这样的。 不过正如 Kevin Ballard 指出的那样,这种做法也有不好之处,就是它绑定了另外一个变量。这个例子里 if let key = foo(),value = dict[key] { ... } 这就影射出之前例子中没有显现出来的变量问题了。如果像这样定义,会导致 if 语句执行内部的闭包中的命名冲突。这种情形可能很难发生,但是可选映射中就不会发生这种问题: // if let value = foo().map({dict[$0]}) { ... } // 错误! if let value = foo().flatMap({dict[$0]}) { ... } // 再次感谢 @oisdk 即使这样,我还是觉得两步的方式胜在了可读性上。函数式链式调用会变得更加复杂,而且在现实情况中也会因为实际问题让代码使用更多符号、变得冗长。代码看上去变得优雅却很难发现问题。 对于我来说,我会问自己下面这几个问题:
这就是我的想法。你怎么看?
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- flash – 如何将视频嵌入GitHub README.md?
- ruby-on-rails – 安装json(1.8.6)时发生错误,Bu
- ruby-on-rails – 支持Rack / Rails的HTTP / 2
- 正则表达式matcher.group用法
- 微信开发,对象转换为xml时候引用XStream这个类报
- Cocos2dx引擎笔记——SQLite集成与用法
- postgreSQL初步应用
- actionscript-3 – 在由AS3添加到舞台的MovieCli
- JSONObject解析引发java.lang.OutOfMemoryError问
- [WPF] Error : Parameter count mismatch (使用D