如果我有一個函數返回一個承諾,並調用另一個函數也返回一個承諾,是有可能在兩者之間轉換,而不這樣做......轉換爲另一種
func f1() -> Promise<Any?> { ... }
func f2() -> Promise<Void> {
return f1().then { value -> Void in
...
}
}
如果我沒有調用.then
,編譯器不能從一種類型轉換爲另一種類型。
如果我有一個函數返回一個承諾,並調用另一個函數也返回一個承諾,是有可能在兩者之間轉換,而不這樣做......轉換爲另一種
func f1() -> Promise<Any?> { ... }
func f2() -> Promise<Void> {
return f1().then { value -> Void in
...
}
}
如果我沒有調用.then
,編譯器不能從一種類型轉換爲另一種類型。
號一是仿製藥沒有在斯威夫特協變的。你可以不通過[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()
。
太好了。 'asVoid'更清潔。 –
當你說「不這樣做,」你有什麼想法語法?你想要刪除哪部分? –
調用'then'。我正在考慮演員。 –