2017-05-09 33 views
2

我有一個可選的zoomURL屬性的類let zoomURL : String?我可以通過使用它作爲參數來檢查一個可選項是否爲零?

我一直在玩可選的鏈接,試圖縮短我做的零檢查的數量。我知道對於下面我可以很容易地檢查是否let zoomURLString = meeting.zoomURL,但是是否有可能跳過這一步,並立即使用它作爲函數內的參數,並檢查此函數是否爲零?

例如:(這失敗)

if let parsedZoomURL = URL(string: meeting.zoomURL?){ 
    //do stuff 
} 
+1

我也考慮*縮短*可選類型的數量。 ;-) – vadian

+0

'如果let parsedZoomURL = URL(string:meeting.zoomURL ??「」「)'? – Grimxn

+1

相關(dupe?):[在Swift中通過函數(或Init)傳播可選項](http://stackoverflow.com/q/40141531/2976878) – Hamish

回答

3

您可以使用Optional

public func flatMap<U>(_ transform: (Wrapped) throws -> U?) rethrows -> U? 

方法:

if let parsedZoomURL = zoomURL.flatMap({ URL(string: $0) }) { 
    //do stuff 
} 

或較短(如某人在現在刪除評論注意到) :

if let parsedZoomURL = zoomURL.flatMap(URL.init) { 
    //do stuff 
} 

任選結合成功僅當zoomURL不是nil 封閉(然後將其與展開的值的zoomURL 稱爲)不返回nil

+0

有趣的是,總是忘記構建在Optional中的map/flatMap方法。謝謝。 –

+0

對於'zoomURL.flatMap(URL.init)'URL初始化程序如何知道使用不帶'$ 0'的zoomURL屬性?我喜歡使用'map'' filter'和'reduce',但是我擔心'$ 0'對於以前沒有使用過這些函數的開發者來說是有害的。 – Deco

+1

@Deco:'x.flatMap(...)'將一個*函數*作爲參數,並用參數'x'調用該函數。該函數可以是像'{URL(string:$ 0)}'這樣的文字閉包,其中'$ 0'是第一個參數的簡寫。該函數也可以是'URL.init'(如果有多個init方法接受一個參數,那麼編譯器會找出哪一個匹配參數類型)。 –

1

如果你真的想你可以創建一個init擴展URL支持傳遞nil值。如果字符串爲nil,則返回nil

extension URL { 

    init?(string: String?) { 

     guard let url = string else { return nil } 

     self.init(string: url) 
    } 
} 

用法:

if let url = URL(string: meeting.zoomUrl) { 

    // Do stuff 
} 
1

雨燕不會鏈條nil S於方法調用,但它會讓你使用相同的鏈接的語法與擴展屬性:

extension String { 
    var asURL : URL { 
     get { 
      return URL(string: self)! 
     } 
    } 
} 

現在你可以使用鏈接像往常一樣:

if let parsedZoomURL = meeting.zoomURL?.asURL { 
    //do stuff 
} 
相關問題