返回协议类型

时间:2014-12-01 23:01:49

标签: swift

我有一个可以具有特定实现的协议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. 为primsMST'发射IR SIL功能@ _TF10SwiftStuff8primsMSTFPS_9GraphType_PS0__ at /Users/aeubanks/Dropbox/Programming/Apps/SwiftStuff/SwiftStuff/MST.swift:9:1

    由于信号命令失败:分段错误:11

  2. 这不应该是一个问题吗?该函数接受实现GraphType的任何对象,并返回恰好与输入相同的任意GraphType。当我用graph.dynamicType之类的特定实现替换GraphAdjacencyList而不更改它编译的返回类型时,但我更喜欢返回类型与输入的图形相同的类。自动更正甚至表示ret属于GraphType。有什么方法可以解决这个问题吗?

1 个答案:

答案 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是您想要的。