强类型xml属性组合的提示(构建器)

时间:2016-06-21 08:53:42

标签: xml swift

我正在开发一个符合其元素中特定属性限制的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()

1 个答案:

答案 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方法。如果存在所有数据结构继承的协议,则可以将其集成到构建器中,以允许转换它们。但是你必须使用一个临时的类型安全数据结构,它允许你这样做而不是通用字典。