我有一个结构
MyStruct
。它可以从字符串初始化,但是有很多方法会导致字符串无效。我不想简单地创建一个在所有失败情况下返回相同的 init?(string: String)
的可失败初始化程序 nil
,而是希望有一个返回结果类型 Result<MyStruct, Error>
的初始化程序,以便调用方法可以知道哪种失败情况发生并报告信息错误。
我可以写一个方法
static func makeNew(string: String) -> Result<Self, Error>
。这样就不用打电话了
guard let new = MyStruct(string: someString) else {
print("\(someString) was invalid somehow.")
}
print("Object created.)
我可以这样称呼
makeNew
:
switch MyStruct.makeNew(string: someString) {
case .success(let new):
print("Object created")
case .failure(let error):
switch error {
// handle each specific error appropriately
}
}
这是唯一的方法吗?还是 Swift 给了我们一个实际的初始化器来做到这一点?
您可以从初始化器中
throw
来代替:
struct MyStruct {
struct ValidationError: Error {} // Example error
init(_ string: String) throws {
guard isValid() else { throw ValidationError() }
...
}
}
do {
let new = try MyStruct("some string")
print("Object created")
} catch let e as MyStruct.ValidationError {
// handle each specific error appropriately
} catch {
print("Other unexpected error")
}