由于某种原因,使用嵌套的枚举名为Type
的嵌套类可以很好地使用swift编译器。
class A {
class B {
enum Type {
case One
case Two
}
let myC: Type
init(myC: Type) {
self.myC = myC
}
}
func getB(myC: B.Type) -> B {
return B(myC: myC) // ERROR 1
}
}
let a = A()
let b = a.getB(.Two) // ERROR 2
上述代码会产生两个错误:'A.B.Type' is not convertible to 'A.B.Type'
和'A.B.Type.Type' does not have a member named 'Two'
。
以下案例确实有效:
class B
之外class A
let b = A.B(myC: .Two)
enum C
代替enum Type
这是Swift或中的一个错误是这个意图吗? Type
是一个我们不应该使用的保留名称吗?
答案 0 :(得分:6)
B.Type指的是B类的元类型,这就是为什么编译器不喜欢你用名称' Type'来定义内部枚举。
您可以在变量/常量声明中使用Type
来进行类反射:
class A {
required init() {}
}
class B {
var a: A.Type
var aInstance: A
init() {
a = A.self
aInstance = a()
}
}
答案 1 :(得分:4)
是的,它是一个保留字。但是你可以直接前进并使用保留字,只要你用反引号标记它。这很好用:
class A {
class B {
enum Type {
case One
case Two
}
let myC: `Type`
init(myC: `Type`) {
self.myC = myC
}
}
func getB(myC: B.`Type`) -> B {
return B(myC: myC)
}
}
答案 2 :(得分:0)
暂不对matt的答案发表评论,所以我必须发帖回答
从Swift 4.1(可能是4.0)开始,当您尝试将Type
保留字用于Type名称(在问题中测试嵌套枚举)时,您现在会收到编译器错误:
不得为类型成员命名'键入'因为它会与之发生冲突 &foo.Type'表达