我正在开发一个符合其元素中特定属性限制的xml构建器。例如,此Person元素的唯一有效属性是“gender”,值只能是“male”或“female”。
现在,我正在使用[String:String]
作为属性键/值。我想要一种强类型的方法来强制每个唯一元素属性要求的这些限制。
我对Swift这样做感到茫然。任何想法将不胜感激。谢谢!
extension XmlBuilder {
func person(text: String? = "", attributes: [String:String] = [String:String]()) -> XmlBuilder {
fn = compose(fn, { doc in
doc.root.addChild(name: "Person", value: text, attributes: attributes)
return doc
})
return self
}
}
let xml = XmlBuilder()
.person("Jon", attributes: ["gender":"male"])
.construct()
答案 0 :(得分:0)
您应该考虑以类型安全的方式构建对象模型,然后让它自己在内部或外部呈现为XML,而不是使用类型安全的XML构建器。
所以你可以:
enum Gender { case Male, Female }
struct Person { let name:String; let gender:Gender }
然后,您可以以类型安全的方式创建它们:
Person(name:"alblue", gender: .Male)
然后遍历元素以生成XML元素,或者添加一个返回包含元素的String的toXML方法。如果存在所有数据结构继承的协议,则可以将其集成到构建器中,以允许转换它们。但是你必须使用一个临时的类型安全数据结构,它允许你这样做而不是通用字典。