代码之家  ›  专栏  ›  技术社区  ›  J. Doe

访问类实例外部的泛型类类型

  •  0
  • J. Doe  · 技术社区  · 5 年前

    这是我的代码:

    class Person<T> {
    
        func printMyType() {
            // I have access to type T.
            print(T.self)
        }
    
    }
    
    class Child {
        let person = Person<Any>()
    
        func printPersonType() {
            // Where did type T went to? It doesn't compile.
            print(person.T.self)
        }
    }
    

    我想知道为什么我不能输入 T 再举个例子 Person 例如 Child . 为什么是类型 T型 跑了?为什么在方法中可用 printMyType ,但不在实例之外?

    以上是我的问题。下面是我想如何使用它。

    class Person<T: Child> {}
    
    class Child {}
    
    // In this class, I want to know what Child is used.
    // To accomplish this, I now need to create a type U to access Child
    // Since I do not know how to access the generic type of Person.
    class BirthGiver<T: Person<U>, U: Child> {
        let child: U.Type
        let person: Person<U>.Type
    
        init(person: T.Type, child: U.Type) {
            self.person = person
            self.child = child
        }
    }
    

    我需要称之为非常丑陋(重复的代码,两次 ,可能类型不安全?):

    BirthGiver(person: Person<Child>.self, child: Child.self)
    

    class BirthGiver<T: Person<U>> {
        let child: Person.T
        let person: Person<U>.Type
    
        init(person: T.Type) {
            self.person = person
            self.child = person.U
        }
    }
    

    所以我可以这样称呼它:

    BirthGiver(person: Person<Child>.self)
    

    但这不会编译,因为没有这样的类型 U . 我明白,但有什么办法吗?一直重复泛型是不对的。

    0 回复  |  直到 5 年前
        1
  •  0
  •   vadian    5 年前

    运行此线路后

    let person = Person<Any>()
    

    person 代表这个

    class Person {
        func printMyType() {
    
            print(Any.self)
        }
    }
    

    在类被实例化的那一刻 T 用尖括号内的类型替换(固定)