2016-02-12 63 views
0

可选链接我有一个let map : [String: String]let key: String?斯威夫特:可选标

什么是访问map[key](并取回一个String?如果我有一个keyNone如果我没有)最简洁的方式?

回答

4
let value = key.flatMap { map[$0] } 
会向特技

,使用从所述struct Optional

/// Returns `nil` if `self` is nil, `f(self!)` otherwise. 
@warn_unused_result 
public func flatMap<U>(@noescape f: (Wrapped) throws -> U?) rethrows -> U? 

方法。

或者,你可以换行到自定义标方法

extension Dictionary { 
    subscript(optKey : Key?) -> Value? { 
     return optKey.flatMap { self[$0] } 
    } 
} 

和简单的写

let value = map[key] 

为了避免与“正常”的标法混乱,使 意向更清楚你的代码的阅读器,可以与外部参数名称定义 标方法:

extension Dictionary { 
    subscript(optional optKey : Key?) -> Value? { 
     return optKey.flatMap { self[$0] } 
    } 
} 

let value = map[optional: key] 
+0

这个答案是越来越好:-)什么是扩展的范围有多大?我可以将其放到需要它的类,它不会对项目的其余任何副作用? – Thilo

+1

@Thilo:分机不能“内部”一类的定义。您可以(据我所知)只使用[访问控制(https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html)的水平,例如, 'private subscript ...'将范围限制为定义的源文件。 –

0

我想我会用决然unfancy

key == nil ? nil : map[key!] 
+0

我肯定会选择'flatMap'或'如果超过这个let'解决方案随时 – redent84

+0

我不喜欢'flatMap'的事情是,它反转参数的顺序('地图[关键]'变成一个在键上操作)。但在@ MartinR的回答中隐藏这个扩展是很整洁的。 – Thilo