为什么我不能使用' Type'作为嵌入在结构中的枚举的名称?

时间:2015-08-27 23:08:36

标签: swift

以下无法编译:

struct S1 {
    enum Type {
        case One, Two, Three
    }

    let e1 : Type
    let i : Int
}

func f1(e : S1.Type) {
    S1(e1: e, i: 1)
}

有错误:

error: cannot invoke initializer for type 'S1' with an argument list of type '(e1: S1.Type, i: Int)'
    S1(e1: e, i: 1)
    ^
note: expected an argument list of type '(e1: S1.Type, i: Int)'
    S1(e1: e, i: 1)

但是,如果我用其他内容替换Type枚举的名称,比如Types,则编译正常。

为什么我不能使用Type作为嵌入在结构中的枚举的名称?

2 个答案:

答案 0 :(得分:2)

你可以这样做(如前所述,Type也在Swift的核心内使用。这就是为什么编译器有点困惑)。如果枚举不嵌套,则用作名称的类型有效:

enum Type {
        case One, Two, Three
}

struct S1 {

    let e1 : Type
    let i : Int
}

func f1(e : Type) {
   var x = S1(e1: Type.One, i: 1)
}

f1(Type.One)

如果你为枚举使用另一个名字,你仍然可以嵌套它:

 struct S2 {


    enum Kind {
        case One, Two, Three
    }

    let e1 : Kind
    let i : Int
}

func f2(e : S2.Kind) {
   var x = S2(e1: S2.Kind.One, i: 1)
}

f2(S2.Kind.One)

答案 1 :(得分:1)

史蒂夫是对的,这是一个关键词。这是规范的相关部分:

  

在特定情境中保留的关键字:关联性,便利性,   dynamic,didSet,final,get,infix,inout,lazy,left,mutating,none,   nonmutating,optional,override,postfix,precedence,prefix,   Protocol,required,right,set,Type,unowned,weak和willSet。   在它们出现在语法中的上下文之外,它们可以是   用作标识符。

显然,顶级枚举类型很好,但嵌入在结构中的不是。关于类型的语言参考部分>元类型类型解释了原因:

  

元数据类型

     

元类型类型是指任何类型的类型,包括类类型,结构类型,枚举类型和协议类型。

     

类,结构或枚举类型的元类型是其名称   该类型后跟.Type。协议类型的元类型 - 不是   在运行时符合协议的具体类型是名称   该协议后跟.Protocol。例如,元的类型   类类型SomeClass是SomeClass.Type和元类型   协议SomeProtocol是SomeProtocol.Protocol。