2015-05-04 3 views
0
//generic queue data object 
class QNode<T> { 
    var key: T? = nil 
    var next: QNode? = nil 
} 

public class Queue<T> { 
//Q1  
private var top: QNode<T>! = QNode<T>() 
    //enqueue the specified object 
    func enQueue(var key: T) { 
     //check for the instance 
     if (top == nil) { 
      //Q2 
      top = QNode() 
     } 
     //establish the top node 
     if (top.key == nil) { 
      top.key = key 
      return 
     } 
     var childToUse: QNode<T> = QNode<T>() 
     var current: QNode = top 
//cycle through the list of items to get to the end. 
     while (current.next != nil) { 
      current = current.next! } 
//append a new item 
     childToUse.key = key 
     current.next = childToUse 
    } 
} 

Если сменить Q1 на частный var top: QNode! = QNode() будет вызывать ошибку «Аргумент для общего параметра« T »не может быть выведен», но в исходном коде Q2 работает нормально без ошибок?Возможно ли, что тип Swift является типичным?

ответ

1

Существует некоторое интересное поведение здесь, потому что в то время как это верно благодаря типа вывод, что:

var top: QNode<String> = QNode() 

такая же, как написание

var top: QNode<String> = QNode<String>() 

или действительно

var top: QNode = QNode<String>() 

Неявное развертывание с использованием! создает некоторое необычное поведение, когда компилятор, хотя он говорит нам, что он интерпретирует

private var top: QNode! = QNode<T>() 

как типа QNode<T>! если альт нажмите на имя переменной, а на самом деле он ведет себя по-разному, чтобы:

private var top: QNode<T>! = QNode<T>() 

или

private var top: QNode<T>! = QNode() 

Эта путаница в компилятор смотрит на меня, как ошибка, потому что он должен либо лечить QNode!, как QNode<T>! или отклонить его вообще. К счастью, осознавая ошибку, вы можете обойти ее, просто используя QNode<T>!.

Я также подал бы эту ошибку с Apple, хотя я не могу воспроизвести ее изолированно и подойдет ближе, когда у меня появится шанс.

+0

Вы используете тип , чтобы продемонстрировать эту проблему? может быть любым типом? –

+0

Примерами являются первые три строки извлеченного кода. Последние три относятся к вашему делу. Вы можете заменить String на T или действительно другим типом. – sketchyTech

+0

Тип вывода трудно адаптировать, нет принципа, который позволит вам знать, когда это будет эффективно. –

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