来自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
}

但是,这是行不通的:Xcode提示T.Type没有成员value(或者有时会崩溃)。

如何实现这种功能?

最佳答案

通用对象当前不支持static存储的属性。当我将您的代码放在操场上时,我实际上收到了此错误:

Playground execution failed: <EXPR>:23:5: error: static variables not yet supported in generic types
    static let value = T.value + U.value
    ^~~~~~

您可以改为使用计算属性来解决该问题(无论如何,这可能一直是您想要的):
struct Sum<T: IntWrapper, U: IntWrapper>: IntWrapper {
    static var value: Int {
        return T.value + U.value
    }
}

注意:由于它是计算属性,因此您需要使用value而不是var声明let

进行这些更改后,println(Sum<A, B>.value)会按您期望的那样打印12

关于swift - Swift中的元编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26939354/

10-11 22:00
查看更多