嵌套类中名为`Type`的枚举失败

时间:2015-02-19 14:31:12

标签: swift enums

由于某种原因,使用嵌套的枚举名为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是一个我们不应该使用的保留名称吗?

3 个答案:

答案 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'表达