我正在使用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`.
}
任何建议都会有所帮助。
答案 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 }
}