我正在尝试将泛型结构依赖注入(inject)到类中,但我不想在类中再次重新指定泛型的占位符类型。这会失控,因为任何使用此类的类都必须不断地做同样的事情。
例如,这个有效:
struct SomeStruct<T : CustomStringConvertible> {
let data: T
}
class SomeClass {
let someStruct = SomeStruct(data: 1)
}
但是,如果我想将 struct
依赖注入(inject)到 class
中,我会得到一个错误:
struct SomeStruct<T : CustomStringConvertible> {
let data: T
}
class SomeClass {
let someStruct: SomeStruct
// ^
// Reference to generic type 'SomeStruct' requires arguments in <...>
init(someStruct: SomeStruct) {
// ^
// Reference to generic type 'SomeStruct' requires arguments in <...>
self.someStruct = someStruct
}
}
那么我必须在 class
中再次指定占位符类型和类型约束:
struct SomeStruct<T : CustomStringConvertible> {
let data: T
}
class SomeClass<T : CustomStringConvertible> {
let someStruct: SomeStruct<T>
init(someStruct: SomeStruct<T>) {
self.someStruct = someStruct
}
}
有什么方法可以避免在类中重新指定占位符类型和约束的需要吗?为什么类不能只知道 SomeStruct
包含 data: CustomStringConvertible
?
最佳答案
不,这是不可能的。您正在尝试描述一个允许指定具体 ( class
) 类型的概念:
class SomeClass { ... }
但使用非具体类型作为成员
class SomeClass {
let someStruct: SomeStruct // <-- non-specified generic type, what placeholder should we use?
}
对于任何具体类型,它们的成员也必须是具体的
// OK
class SomeClass {
let someStruct: SomeStruct<Int>
}
而如果泛型成员的类型绑定(bind)到拥有类型 ( SomeClass
) 本身的泛型类型持有者,则您可以允许泛型成员
// OK (assuming there is no type constraint on the
// generic placeholder in the definition of SomeStruct)
class SomeClass<T> {
let someStruct: SomeStruct<T>
}
最后,关于“重复”类型约束:如果某个给定类型的通用占位符,比如 SomeStruct<T>
正如你的问题,在某种类型约束下,然后自然地(静态类型)任何类型持有者在泛型 SomeStruct
的使用中作为泛型类型说明符“传播”必须确保符合与应用于 SomeStruct
中通用占位符的约束相同的约束.因此,您无法避免在泛型类中指定相同的类型约束 SomeClass<T: ...>
SomeStruct
用作一般绑定(bind)成员。
struct SomeStruct<T : CustomStringConvertible> {
let data: T
}
class SomeClass<T> {
let someStruct: SomeStruct<T>
/* ^ this placeholder is not guaranteed to fulfil
the type constraints which are applied to the
generic typeholder of SomeStruct, hence the
illegality */
}
关于ios - 依赖项注入(inject)通用结构,而无需重新指定占位符类型或约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40693262/