2016-02-12 111 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