那么如何在Swift中定义泛型类常量?
对于"正常"你可以像这样定义它们:
class C {
static let k = 1
}
let a = C.k // 1
但是如果你在泛型类上做同样的事情:
class C<T> {
static let k = 1
}
编译时出现以下错误:
泛型类型尚不支持的静态存储属性
那么如何解决这个问题?
现在,我正在使用struct
解决此问题:
struct CConstant {
static let K = 1
}
这不是在泛型类的范围内定义,但它适用于我。 您有更好的解决方案吗?
-
ps:这是我的第一个问题,如果您认为有必要,请帮助我改进这个问题=)
答案 0 :(得分:2)
您可以在定义了泛型类的同一fileprivate
文件中定义具有private
或.swift
访问级别的全局常量。因此它不会在此文件之外可见,也不会污染全局(模块)命名空间。
如果您需要从当前文件外部访问此常量,请将其声明为internal
(默认访问级别)或public
并将其命名为ClassConstant
,这样很明显它与Class
有关。
答案 1 :(得分:1)
对于普通的值类型常量,你可以简单地实现一个只读的静态计算属性:
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 let _k = SomeClass()
class C<T> {
static var k : SomeClass { return _k }
}
同样,这允许您作为C<T>
上的静态成员访问它,同时不会污染全局命名空间&#39; (虽然不在你定义的Swift文件之外)。