我试图依赖注入一个泛型结构到一个类,但我不想重新指定泛型的占位符类型班级也是如此。这会失控,因为任何使用这个类的类都必须执行相同的操作。依赖注入一个通用结构,而不必重新指定占位符类型或约束
举例来说,这个工程:
struct SomeStruct<T : CustomStringConvertible> {
let data: T
}
class SomeClass {
let someStruct = SomeStruct(data: 1)
}
但是,如果我想依赖注入其struct
到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
?
是的,但为什么'SomeClass'必须是通用的?不能只是简单的*拥有*一个通用属性,而不是通用本身?我看不出有什么危险。'SomeClass'不需要更多地了解'data',除了'SomeStruct'说的东西总是这样,'data'将总是'CustomStringConvertible'。在我的例子中,我不关心'SomeClass'甚至在这种用法中知道'data'是'Int'。 – solidcell
@solidcell否,与我的回答顶部相同的论点适用:如果'SomeClass'不是通用的,那么它是一个具体类型,然后它的所有成员必须是具体类型。如果你开始使用泛型,这是一个适用的规则,从Swift的核心概念之一传播出来:强大的输入系统。 – dfri