以下无法编译:
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
作为嵌入在结构中的枚举的名称?
答案 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。