Swift泛型函数,协议和associatedType-无法调用类型为'(from:T)'

时间:2019-12-03 15:55:27

标签: swift generics protocols keypaths

我正在尝试为功能相同的不同类型的对象概括一个函数(使用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方面的专家,也不是完全理解协议的人,我可能迷失了一杯水,我将不胜感激。谢谢

0 个答案:

没有答案