我正在尝试为功能相同的不同类型的对象概括一个函数(使用keyPath从对象中获取值)。
class GenericOutputParameter<Type>: Equatable {
// Single Line Parameter for the Deal parameters
var path: WritableKeyPathApplicator<Type>
var label: String
var value: Any? // THIS IS OPTIONAL
var format: Int
var columnID: String
var order: Int
init(path: WritableKeyPathApplicator<Type>, label: String, value: Any?, format: Int, order: Int, columnID: String) {
self.path = path
self.label = label
self.value = value
self.format = format
self.order = order
self.columnID = columnID
}
}
protocol haveOutputs {
associatedtype containerType
var dictionary: [String : (path: WritableKeyPathApplicator<containerType>,label: String, value: Any, format: Int, order: Int)] { get set }
var outputs: [GenericOutputParameter<containerType>] { get set }
}
func fillOutputs<T: haveOutputs>(container: inout T) {
container.outputs.removeAll()
for (columnID, valueTuple) in container.dictionary {
container.outputs.append(GenericOutputParameter(path: valueTuple.path, label: valueTuple.label, value: valueTuple.path.retrieve(from: container), format: valueTuple.format,order: valueTuple.order, columnID: columnID))
}
container.outputs.sort(by: { $0.order < $1.order })
} // END OF FILLOUTPUTS
我正在协议中使用associatedType,因为每个对象都有自己不同的字典。
函数fillOutputs(container:inout T)从对象获取键路径所指定参数的值,并将其附加到数组中。
我在代码结尾处的container.outputs.append行中遇到错误,如下所示:无法使用类型为((from:T))的参数列表调用'retrieve'。这是指检索(来自:容器)。在尝试泛化之前,此函数是每个对象(容器)的方法,并且使用restore(from:self)可以工作。
作为参考,retrieve方法是另一个通用函数的一部分:
class WritableKeyPathApplicator<Type> {
private let applicator: (Type, Any) -> Type
private let retriever: (Type) -> Any
init<ValueType>(_ keyPath: WritableKeyPath<Type, ValueType>) {
applicator = {
...
}
retriever = {
...
}
}
func apply(value: Any, to: Type) -> Type {
return applicator(to, value)
}
func retrieve(from: Type) -> Any {
return retriever(from)
}
}
鉴于我既不是Swift方面的专家,也不是完全理解协议的人,我可能迷失了一杯水,我将不胜感激。谢谢