将Swift协议属性覆盖为可选

时间:2018-07-23 14:05:10

标签: ios swift xml codable xmlmapper

我正在使用gradle-jooq-plugin/README.md这个库。

它包含协议,

public protocol XMLBaseMappable {
    var nodeName: String! { get set }
}

我想使此nodeName对于实现它的结构/类是可选的,例如

public protocol CustomXMLBaseMappable {
    var nodeName: String? { return "default" }

    //I don't want struct/classes using it, implements `nodeName`.
}

任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:1)

XMLBaseMappable协议中此属性的存在对于正确运行整个库至关重要。

话虽如此,您不能在结构和类中忽略此属性的实现,但可以在超类中“隐藏”它。使用这个:

class BasicXMLMappable: XMLMappable {
    var nodeName: String!

    required init(map: XMLMap) {

    }

    func mapping(map: XMLMap) {

    }
}

您可以拥有XMLMappable个对象,它们扩展了BasicXMLMappable,并且它们不必实现nodeName属性:

class TestBasicXMLMappable: BasicXMLMappable {

    // Your custom properties

    required init(map: XMLMap) {
        super.init(map: map)
    }

    override func mapping(map: XMLMap) {
        // Map your custom properties
    }
}

编辑: 从1.5.1版开始,您可以使用XMLStaticMappable在扩展中实现XMLMapper。例如:

class CustomClass {
    var property: String?
}

extension CustomClass: XMLStaticMappable {
    var nodeName: String! {
        get {
            return "default"
        }
        set(newValue) {

        }
    }

    static func objectForMapping(map: XMLMap) -> XMLBaseMappable? {
        // Initialize CustomClass somehow
        return CustomClass()
    }

    func mapping(map: XMLMap) {
        property <- map["property"]
    }
}

希望这会有所帮助。

答案 1 :(得分:0)

您不能覆盖原始协议,但是可以像这样手动更改它:

@objc protocol XMLBaseMappable {
    @objc optional var nodeName: String! { get set }
}

或保持原样,并创建自定义协议

@objc protocol CustomXMLBaseMappable {
    @objc optional var nodeName: String! { get set }
}