Swift中的元编程

Yar*_*sky 10 generics template-meta-programming swift

来自C++,我试图在Swift中做一些元编程.例如,我想实现一个添加两个数字的元函数.我尝试过这样的事情:

protocol IntWrapper {
    class var value: Int { get }
}

struct A: IntWrapper {
    static let value = 5
}

struct B: IntWrapper {
    static let value = 7
}

struct Sum<T: IntWrapper, U: IntWrapper>: IntWrapper {
    static let value = T.value + U.value
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用:Xcode抱怨T.Type没有成员value(或者有时只是崩溃).

如何实现这样的功能?

Mik*_*e S 8

static通用对象(目前)不支持存储的属性.当我把你的代码放在游乐场时,我实际上得到了这个错误:

Playground execution failed: <EXPR>:23:5: error: static variables not yet supported in generic types
    static let value = T.value + U.value
    ^~~~~~
Run Code Online (Sandbox Code Playgroud)

你可以通过使用计算属性来解决这个问题(无论如何,这可能是你想要的):

struct Sum<T: IntWrapper, U: IntWrapper>: IntWrapper {
    static var value: Int {
        return T.value + U.value
    }
}
Run Code Online (Sandbox Code Playgroud)

注:由于这是一个计算的属性,你需要声明valuevar和不let.

随着这些变化,println(Sum<A, B>.value)印刷品12就像你期望的那样.