这是我的代码:
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
中可用但在实例外部不可用?
以上是我的问题。下面是我要使用它的方式。
我想知道是否有可能获得Person
的通用类型,因为现在在我的“真实”代码中,我需要重复通用约束:
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
}
}
我需要称它为丑陋(重复的代码,两次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 :(得分:0)
运行此行之后
let person = Person<Any>()
person
代表此静态类
class Person {
func printMyType() {
print(Any.self)
}
}
目前实例化的类T
被(固定)替换为尖括号中的类型