将 swift 协议 属性 覆盖为可选

Override swift protocol property to optional

我正在使用这个库,https://github.com/gcharita/XMLMapper

它包含协议,

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

我想让这个 nodeName 对我的 struct/classes 实现来说是可选的,比如

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

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

任何建议都会有所帮助。

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

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

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

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

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

话虽如此,您不能在结构和 classes 中省略此 属性 的实现,但您可以 "hide" 在超级 class 中实现它.使用这个:

class BasicXMLMappable: XMLMappable {
    var nodeName: String!

    required init(map: XMLMap) {

    }

    func mapping(map: XMLMap) {

    }
}

您可以拥有扩展 BasicXMLMappableXMLMappable 个对象,它们不必实现 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"]
    }
}

希望对您有所帮助。