作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
那么如何在 Swift 中定义泛型类常量呢?
对于“普通”类,您可以这样定义它们:
class C {
static let k = 1
}
let a = C.k // 1
但是如果你对泛型类做同样的事情:
class C<T> {
static let k = 1
}
编译时出现以下错误:
Static stored properties not yet supported in generic types
那么如何解决呢?
现在,我正在使用 struct
来解决这个问题:
struct CConstant {
static let K = 1
}
这不是在泛型类的范围内定义的,但它对我有用。 你有更好的解决方案吗?
--
ps:这是我在这里的第一个问题,所以如果你认为有必要,请帮助我改进这个问题=)
最佳答案
对于普通的值类型常量,您可以简单地实现一个只读的静态计算属性:
class C<T> {
// will be evaluated every time the static property is accessed,
// therefore not suited for non-trivial constants.
static var k : Int { return 1 }
}
let a = C<()>.k // Access k on C<Void>
这样做的好处是不会污染“全局命名空间”,因为它是 C<T>
上的静态成员.尽管不幸的是,您必须指定一个泛型参数才能使用常量——因为您不能在没有泛型参数的情况下引用泛型类的类型(因为静态范围内的任何内容都可能需要定义它)。
对于非平凡常量,您可以定义一个私有(private)全局常量,并在您的泛型类中使用只读静态计算属性,以便将其暴露给外界:
private let _k = SomeClass()
class C<T> {
static var k : SomeClass { return _k }
}
同样,这允许您将其作为 C<T>
上的静态成员进行访问同时不污染“全局命名空间”(尽管不在您定义它的 Swift 文件之外)。
关于swift - 如何在swift的泛型类中定义静态常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39543628/
我是一名优秀的程序员,十分优秀!