2017-03-21 1 views
3

J'ai un problème étrange avec le chaînage optionnel et la coalescence nulle dans Swift. Quelqu'un peut-il expliquer pourquoi le code suivant ne compile pas:Swift: erreur de compilation avec chaînage optionnel et coalescence nulle

class A<T> { 
    var val: T 
    var x: A<T>? 
    var y: A<T>? 
    init(t:T){ 
     val = t 
    } 
    func test() -> [T] { 
     return (self.x?.test() ?? []) + [val] + (self.y?.test() ?? []) 
    } 
} 

Mais lors de l'écriture

func test() -> [T] { 
    return (self.x?.test() ?? []) + ([val] + (self.y?.test() ?? [])) 
} 

Il fait? L'erreur dit:

Cannot convert value of type '[T]?' to expected argument type '[_]?' 

Pour moi, il ressemble beaucoup comme un bug du compilateur.

+0

Il ne semble un peu comme un bug. Peut-être publier sur leur page [bugs] (https://bugs.swift.org/). –

Répondre

3

La déduction de type est difficile avec des expressions compliquées. Ce [_] signifie généralement que le type est inconnu - n'a pas pu être déduit. Simplifier l'expression résout le problème dans 99% du temps:

class A<T> { 
    var val: T 
    var x: A<T>? 
    var y: A<T>? 
    init(t:T){ 
     val = t 
    } 
    func test() -> [T] { 
     let xResult = self.x?.test() ?? [] 
     let yResult = self.y?.test() ?? [] 

     return xResult + [val] + yResult 
    } 
} 

Un autre 99% du temps, le type de problèmes de inférant peuvent être résolus en spécifiant un type explicitement:

return (self.x?.test() as [T]? ?? []) + [val] + (self.y?.test() ?? []) 

Vous avez trouvé un contournez-vous. Cette solution de contournement avec parenthèses supprime un certain nombre de chemins d'inférence de type.

présentées en tant que SR-4309

+0

Ceci fournit une bonne solution au problème. Peut-être que l'équipe de Swift serait toujours intéressée à voir le peu de code problématique affiché ci-dessus, bien que je doute que ce soit une priorité élevée, si elle est prioritaire, de sorte qu'elle soit finalement traitée. –

+1

@MichaelFourre Je pense qu'un problème similaire a déjà été signalé plusieurs fois. Je me souviens des questions ici sur SO. Cette expression est en fait assez simple, toutes les variables sont bien définies dans la portée, il ne devrait pas y avoir de place pour inférer des problèmes. C'est probablement la concaténation avec les opérateurs qui en est la cause première. – Sulthan

+0

Merci pour votre contribution @Sulthan c'est une bonne information à savoir –