我有一个 struct MyStruct.它可以从字符串初始化,但有许多方法可以使字符串无效.与其简单地创建一个在所有故障情况下返回相同nil的失败初始化器init?(string: String),我更希望有一个返回结果类型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给了我们一个真正的初始化器来做这件事?

推荐答案

相反,您可以从初始值设定项中 Select 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: \(new)")
} catch let e as MyStruct.ValidationError {
    // handle each specific error appropriately
} catch {
    print("Other unexpected error")
}

返回T(或T的初始值设定项)标记为throws的函数大致与返回Result<T, any Error>的函数同构.

Swift相关问答推荐

AirPods手势不发送AVAudioApp静音状态通知

阻塞(受CPU限制的)任务的异步功能?

它是RxSwift中直接用于可扩展视图的有效的可扩展BehaviorRelay值?

通常从数组调用的SWIFT静态协议函数

从AppKit打开SwiftUI设置

快速并行读取进程 standardOutput 和 standardError 而不会阻塞

Observable.create 捕获行为

OSX 中的 Popover 无法确定透明度

CardStack 和 Lottie

(Swift)混淆了函数内 for-in 循环的返回值和循环后(函数内)的返回值)

如何在 Swift 中对单个单词进行词形还原

如何在 SwiftUI 中用图像替换占位符文本?

Swift-如何接受多个(联合)类型作为参数

SwiftUI Preview 不适用于 Core Data

Swift 自定义字体 Xcode

如何以编程方式读取 wkwebview 的控制台日志(log)

如何在 Swift 中使用 Crashlytics 登录?

两个 Date 对象之间的所有日期 (Swift)

如何在 Swift 中判断变量的类型

如何将多个枚举值作为函数参数传递