我正在尝试使用静态方法作为工厂方法。原因是我有两个类以不同的方式实现算法。一种非常简单,我可以依靠它来获得有效的结果,另一种性能更高,但是更加复杂,因此,我使用简单的一种来验证对快速一种和生产中的快速一种的更改。
快速方法在初始化时比较挑剔,因此我尝试在其中创建一个静态方法,如果参数受到适当限制,该方法仅返回快速方法的一个实例。否则,它将返回该类的基本版本-请考虑ImplementationForWhenParameterIsEmpty
和ImplementationForWhenParameterTotalIsZero
。
如图所示实施时,在工厂方法中出现以下错误:
无法将类型为'ParameterWithCommonGeneric '的值转换为 预期参数类型'ParameterWithCommonGeneric <_>'
为简单起见,在示例中,我从工厂方法中省略了基本类,只是返回了具有“快速”实现的类实例。该错误仍然存在。
如果将泛型从工厂方法中删除并放在扩展签名中,或者该方法未实现为静态方法,则错误消失。我想做前者,但是这使我感到怀疑。它只是简单地重新声明了类签名中的通用约束,因此似乎不应该有所作为。
工厂方法在示例的底部。
protocol CommonProtocolForClasses { associatedtype AAssociatedType: CommonProtocolForGenerics }
protocol CommonProtocolForGenerics {}
class ClassA<T: CommonProtocolForGenerics>: CommonProtocolForClasses {
typealias AAssociatedType = T
init(_ param: ParameterWithCommonGeneric<T>) {}
}
class ParameterWithCommonGeneric<T: CommonProtocolForGenerics> {}
class ClassWrapper<T: CommonProtocolForGenerics>: CommonProtocolForClasses {
typealias AAssociatedType = T
init<C: CommonProtocolForClasses>(_ adopterOfCommonProtocolForClasses: C) {}
}
extension CommonProtocolForClasses {
internal var wrapped: ClassWrapper<AAssociatedType> { return ClassWrapper(self) }
}
extension ClassA {
static func with<U: CommonProtocolForGenerics>(_ param: ParameterWithCommonGeneric<U>) -> ClassWrapper<U> {
return ClassA(param).wrapped // ERROR IS HERE
}
}
func with<U: CommonProtocolForGenerics>(_ param: ParameterWithCommonGeneric<U>) -> ClassWrapper<U> {
return ClassA(param).wrapped // NO ERROR
}
extension ClassA where T: CommonProtocolForGenerics {
static func with(_ param: ParameterWithCommonGeneric<T>) -> ClassWrapper<T> {
return ClassA(param).wrapped // NO ERROR
}
}