将 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) {
}
}
您可以拥有扩展 BasicXMLMappable
的 XMLMappable
个对象,它们不必实现 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"]
}
}
希望对您有所帮助。
我正在使用这个库,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) {
}
}
您可以拥有扩展 BasicXMLMappable
的 XMLMappable
个对象,它们不必实现 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"]
}
}
希望对您有所帮助。