2016-12-01 4 views
0

Если у меня есть одна функции, которая возвращает обещание и вызывает другую функцию, которая также возвращает обещание, которое можно конвертировать между ними, не делая это ...Преобразование из одного типа обещания других

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

func f2() -> Promise<Void> { 

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

     ... 
    } 
} 

Если у меня нет вызова .then, компилятор не может преобразовать его из одного типа в другой.

+0

Когда вы говорите «без этого», какой синтаксис вы имели в виду? Какую часть вы пытаетесь удалить? –

+0

Вызов 'then'. Я думал о броске. –

ответ

2

Нет. Во-первых, генерики не являются ковариантными в Swift. Вы не можете передать [String], где вы ожидаете [Any], поэтому вы не можете конвертировать из Promise<Void> в Promise<Any?>. В вашем случае это еще хуже, поскольку вы пытаетесь конвертировать из Promise<Any?> в Promise<Void>, а Any? - это не Void.

Возможно, вы думаете о Void как-то особенном, так как это означает «ничего» в магическом, компиляторе. Это не то, что Void есть. Это всего лишь тип для пустого кортежа (()). Вы не можете конвертировать из 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' намного чище. –

 Смежные вопросы

  • Нет связанных вопросов^_^