2014-12-01 3 views
0

У меня есть протокол GraphType, которые могут иметь конкретные реализации:Возвращаясь тип протокола

protocol GraphType { 
    var vertexCount: Int {get} 
    var edgeCount: Int {get} 
    init(vertexCount: Int) 
    ... 
} 

Тогда у меня есть функция, чтобы построить MST:

func primsMST(graph: GraphType) -> GraphType { 
    let ret = graph.dynamicType(vertexCount: graph.vertexCount) 

    return ret 
} 

Там нет прямого предупреждения компилятора в коде , но компилятор жалуется на эту функцию:

  1. При испускании функции ИК-SIL ион @ _TF10SwiftStuff8primsMSTFPS_9GraphType_PS0__ для 'primsMST' в /Users/aeubanks/Dropbox/Programming/Apps/SwiftStuff/SwiftStuff/MST.swift:9:1

    командованию не удался из-за сигнал: неисправность Сегментации: 11

Это не должно быть проблемой? Функция принимает любой объект, который реализует GraphType и возвращает произвольное GraphType, которое бывает таким же, как и вход. Когда я заменяю graph.dynamicType на конкретную реализацию, например GraphAdjacencyList, без изменения типа возвращаемого им типа, но я бы предпочел, чтобы тип возвращаемого значения был тем же классом, что и введенный граф. Auto-correct даже говорит, что ret имеет GraphType. Любой способ решить это?

+0

Люди Swift ясно дали понять, что код, который компилируется, а затем сбой компилятора, проблематичен, и они хотят знать об этом. Поэтому, пожалуйста, напишите отчет об ошибке в Apple! Между тем, я опубликовал обходное решение с общей функцией. – matt

ответ

0

Используйте общую функцию. Ниже приведена сокращенная версия вашего кода:

protocol GraphType { 
    var vertexCount: Int {get} 
    init(vertexCount: Int) 
} 
func primsMST<T:GraphType>(what:T) -> GraphType { 
    let result = T(vertexCount:what.vertexCount) 
    return result 
} 

Давайте попробуем. Я определение структуры, которая принимает ваш GraphType:

struct St : GraphType { 
    var vertexCount = 0 
    init(vertexCount:Int) { 
     self.vertexCount = vertexCount 
    } 
} 

Здесь мы идем ....

let st = St(vertexCount:25) 
    let result = primsMST(st) 

Немного протоколирования/breakpointing покажет, что result является то, что вы хотите быть.

+0

На самом деле, можно объявить общий func 'func primsMST (что: T) -> T', поскольку все дело в том, что происходит, что происходит. :) – matt

+0

Ой, что имеет смысл, чем круговой путь, который я сделал. Благодаря! – aeubanks

+0

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

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