2016-12-01 101 views
0

如果我有一個函數返回一個承諾,並調用另一個函數也返回一個承諾,是有可能在兩者之間轉換,而不這樣做......轉換爲另一種

func f1() -> Promise<Any?> { ... } 

func f2() -> Promise<Void> { 

    return f1().then { value -> Void in 

     ... 
    } 
} 

如果我沒有調用.then,編譯器不能從一種類型轉換爲另一種類型。

+0

當你說「不這樣做,」你有什麼想法語法?你想要刪除哪部分? –

+0

調用'then'。我正在考慮演員。 –

回答

2

號一是仿製藥沒有在斯威夫特協變的。你可以不通過[String],你期待一個[Any],所以你不能從轉換到Promise<Void>Promise<Any?>。在你的情況更糟糕,因爲你嘗試轉換從Promise<Any?>Promise<Void>Any?不是Void

你也許會想的Void爲莫名其妙特殊,喜歡它意味着在一個神奇的,編譯器的方式「一無所有」。這不是Void。它只是空元組的一個typealias(())。您不能轉換從Any?()。想象一下,如果你能做到這一點。然後,我可以這樣寫:

var list: [Void] = [] // This is just as legal as Promise<Void> 
f2().then { x: Void in 
    list.append(x) 
} 

現在我已經追加一些隨機選到我的()陣列。這將會崩潰,編譯器不會救我。

你當然可以創建一個幫助做到這一點,如果你想要的,如:

extension Promise { 
    func ignoringResult() -> Promise<Void> { 
     return self.then { _ in } 
    } 
} 

然後你可以寫:

func f2() -> Promise<Void> { 
    return f1().ignoringResult() 
} 

PromiseKit已經有這個轉換器:Promise.asVoid()

+0

太好了。 'asVoid'更清潔。 –

相關問題