如何在swift中定义泛型类中的静态常量?

时间:2016-09-17 06:36:56

标签: swift generics static constants

那么如何在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:这是我的第一个问题,如果您认为有必要,请帮助我改进这个问题=)

2 个答案:

答案 0 :(得分:2)

您可以在定义了泛型类的同一fileprivate文件中定义具有private.swift访问级别的全局常量。因此它不会在此文件之外可见,也不会污染全局(模块)命名空间。

如果您需要从当前文件外部访问此常量,请将其声明为internal(默认访问级别)或public并将其命名为ClassConstant,这样很明显它与Class有关。

详细了解access levels in Swift 3

答案 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文件之外)。