我有一个可以具有特定实现的协议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
}
代码中没有直接的编译器警告,但编译器抱怨函数:
为primsMST'发射IR SIL功能@ _TF10SwiftStuff8primsMSTFPS_9GraphType_PS0__ at /Users/aeubanks/Dropbox/Programming/Apps/SwiftStuff/SwiftStuff/MST.swift:9:1
由于信号命令失败:分段错误:11
这不应该是一个问题吗?该函数接受实现GraphType
的任何对象,并返回恰好与输入相同的任意GraphType
。当我用graph.dynamicType
之类的特定实现替换GraphAdjacencyList
而不更改它编译的返回类型时,但我更喜欢返回类型与输入的图形相同的类。自动更正甚至表示ret
属于GraphType
。有什么方法可以解决这个问题吗?
答案 0 :(得分: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)
稍微记录/破坏点将显示result
是您想要的。