KVC以及相关类型

时间:2017-11-08 08:52:53

标签: swift swift4 kvc

我有一个Bindable协议

protocol Bindable: class {
    associatedtype ObjectType: Any
    associatedtype PropertyType

    var boundObject: ObjectType? { get set }
    var propertyPath: WritableKeyPath<ObjectType, PropertyType>? { get set }

    func changeToValue(_ value: PropertyType)
}

我希望有一个用于更改值的默认实现

extension Bindable {

    func changeToValue(_ value: PropertyType) {
        boundObject?[keyPath: propertyPath] = value
    }
}

但这会引发错误说:

  

类型'Self.ObjectType'没有下标成员

propertyPath的定义是说KeyPathObjectType所以这里发生了什么?如何告诉编译器propertyPath确实是更改对象的keyPath。

1 个答案:

答案 0 :(得分:2)

我认为你不应该propertyPath选择。这应该有效:

protocol Bindable: class {
    associatedtype ObjectType: Any
    associatedtype PropertyType

    var boundObject: ObjectType? { get set }
    var propertyPath: WritableKeyPath<ObjectType, PropertyType>{ get set }

    func changeToValue(_ value: PropertyType)
}

extension Bindable {

    func changeToValue(_ value: PropertyType) {
        boundObject?[keyPath: propertyPath] = value
    }
}