【发布时间】:2020-02-09 10:07:45
【问题描述】:
让我先说一下我的作品......
let a:String
let b:Int
let c:Double
init?(doc:XMLDocument){
guard let tempString = (try? doc.objects(forXQuery: "path/path/A").first as? XMLNode)?.stringValue else {return nil}
self.a = tempString
guard let tempString2 = (try? doc.objects(forXQuery: "path/B").first as? XMLNode)?.stringValue else {return nil}
guard let tempInt = Int(tempString2) else {return nil}
self.b = tempInt
guard let tempString3 = (try? doc.objects(forXQuery: "path/path/C").first as? XMLNode)?.stringValue else {return nil}
guard let tempDouble = Double(tempString3) else {return nil}
self.c = tempDouble
}
}
我对此不满意。 我可以通过进行空检查和重用临时变量来简化
init?(doc:XMLDocument){
var tempString:String? = (try? doc.objects(forXQuery: "path/path/A").first as? XMLNode)?.stringValue
if tempString != nil {self.a = tempString!} else {return nil}
tempString = (try? doc.objects(forXQuery: "path/B").first as? XMLNode)?.stringValue
if tempString != nil && Int(tempString!) != nil {self.b = Int(tempString!)!} else {return nil}
tempString = (try? doc.objects(forXQuery: "path/path/C").first as? XMLNode)?.stringValue
if tempString != nil && Double(tempString!) != nil {self.c = Double(tempString!)!} else {return nil}
}
理想情况下,我希望能够在检查属性时分配属性,而无需通过某种临时变量。
类似:
struct Foo {
let a:String
let b:Int
let c:Double
init?(doc:XMLDocument){
do {
if case a = try (doc.objects(forXQuery: "path/path/A").first as? XMLNode)?.stringValue { } else {return nil}
if case b = Int(try (doc.objects(forXQuery: "path/path/B").first as? XMLNode)?.stringValue ?? "ZZZ") { } else {return nil}
if case c = Double(try (doc.objects(forXQuery: "path/path/C").first as? XMLNode)?.stringValue ?? "ZZZ") { } else {return nil}
} catch {
return nil
}
}
}
在没有初始化所有存储属性的情况下使用 self 会出错。
有没有更好的方法?
【问题讨论】:
标签: swift initializer failable