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

Lin*_*äck 4 enums swift

由于某种原因,具有嵌套枚举的嵌套类名为Typedosen不能很好地与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
Run Code Online (Sandbox Code Playgroud)

上面的代码产生两个错误:'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我们不应该使用的保留名称吗?

kel*_*ket 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()
    }
}
Run Code Online (Sandbox Code Playgroud)


mat*_*att 5

是的,这是一个保留字。但是你可以直接使用保留字,只要你用反引号标记它。这工作正常:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)