2015-06-20 3 views
0

Это функция, которую я пытался использоватьНужна помощь в использовании Swift InOut с дополнительным

func merge(inout A: DNode?, inout And B: DNode?) -> DNode? { 
    if A == nil && B == nil { 
     return nil 
    } 
    if A == nil { 
     return B 
    } 
    if B == nil { 
     return A 
    } 
    return A!.isLessThan(B!) ? A! : B! 
} 

Вот как я пытался использовать функцию «слияния»

class Heap { 
    var minDNode: DNode? 

    func start(inout newNode: DNode) { 
     self.minDNode = merge(&self.minDNode, And: &newNode) // error 
     // Cannot invoke 'merge' with an argument list of type '(inout DNode?, And: inout DNode)' 
    } 

    func merge(inout A: DNode?, inout And B: DNode?) -> DNode? { 
     ... 
    } 
} 

Как это можно исправить проблема?

Глядя на ответ от Swift optional inout parameters and nil,

делает

var minDNode: DNode? 

в

var minDNode: DNode? = nil 

не решить проблему

+2

Почему 'merge()' принимает inout параметры? Аргументы не изменяются, поэтому это кажется ненужным осложнением. –

+0

о, я вырезал длинную часть из функции –

ответ

0

@MartinR делает хорошую точку в комментариях : «Почему merge() принимает inout параметры? Аргументы не изменяются, поэтому это кажется ненужным осложнением ».

Причина ошибки заключается в том, что вы должны передать точный тип при использовании inout и DNode и DNode? имеет два различных типа. newNode потребности быть объявлены как необязательные, потому что это то, что слияние ожидает:

func start(inout newNode: DNode?) { 
    self.minDNode = merge(&self.minDNode, And: &newNode) // this call now works 
} 

Вы, вероятно, следует переработать код, хотя, чтобы удалить inout вызовы, когда они не нужны.

+0

спасибо! решил ошибку. –

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