Por que não posso passar um opcional implicitamente desembrulhado como UnsafeMutablePointer?
Parece que o Xcode 9.3 corrigeum problema que eu estava tendo, mas no Swift 4.1, a segunda metade desse código ainda não é compilada:
var obj: SomeClass! ; class SomeClass {}
func inoutFunc(_: inout SomeClass?) {}
inoutFunc(&obj) // works
func pointerFunc(_: UnsafeMutablePointer<SomeClass?>) {}
pointerFunc(&obj) // <-- COMPILER ERROR
A chamada parainoutFunc
agora está bom, mas a chamada parapointerFunc
ainda me dá um erro:
Não é possível chamar 'pointerFunc' com uma lista de argumentos do tipo '(inout SomeClass!)'
Ou no contexto original:
Não é possível transmitir um valor imutável do tipo 'ActualClass?' como argumento inout
Semelhante ao meu problema no Swift 4.0 (onde oinoutFunc
também não compilou) se eu alterar a declaração paravar obj: SomeClass?
então a segunda chamada de função é compilada sem reclamação.
Esse é outro bug do Swift persistente relacionado aos Opcionais Implicitamente Desembrulhados ou issoUnsafeMutablePointer
Não se espera que a situação funcione como ainout
versão agora faz? Existe uma solução alternativa relativamente limpa?
Fundo:
No código real, opointerFunc
call é uma função de estrutura da Apple que inicializa a instância ou retorna um status de erro.
Desde que eu jáguard AppleFrameworkInitializer(&obj) == noErr else { /* … */ }
, Não quero lidar com a reatribuição de um opcional temporário ou preciso desembrulhar constantementeobj!
em todo o código a seguir.
Ou seja, esse parece ser um caso de uso legítimo para os Opcionais Implicitamente Desembrulhados e estou me perguntando por que ainda não consigo usar um aqui.