Swift 作为可选项访问枚举关联值

Swift 作为可选项访问枚举关联值,swift,Swift,如何访问特定案例的枚举值,而不必为每个案例实现枚举函数 我是这样想的: enum Result<S, F> { case success(S) case failure(F) } let resultSuccess = Result<Int, String>.success(1) let resultFailure = Result<Int, String>.failure("Error") let error: String? = c

如何访问特定案例的枚举值,而不必为每个案例实现枚举函数

我是这样想的:

enum Result<S, F> {

    case success(S)
    case failure(F)

}

let resultSuccess = Result<Int, String>.success(1)
let resultFailure = Result<Int, String>.failure("Error")

let error: String? = case let .failure(error) = resultFailure
枚举结果{
个案成功
案例失败(F)
}
让resultSuccess=Result.success(1)
让resultFailure=Result.failure(“错误”)
let错误:字符串?=案例let.failure(error)=resultFailure
类似的情况也可以接受:

let错误:字符串?=(案例let.failure(error)=resultFailure)?错误:“

显然,这甚至没有编译,但这就是我想要的要点

可能吗

编辑:解释为什么我的问题与


答案很简单,它访问
if
语句中的值,而不是像我的问题中那样作为
可选的
。要指定更多,请设想我必须从多个枚举中提取值,可能还要从枚举中提取枚举,为此我需要嵌套的
if
,或
guard
,但使用
guard
我将无法继续流,因为它强制
返回

恐怕这是您能得到的最大值:

    let error: String?
    if case .failure(let e) = resultFailure {error = e}

这个问题的技巧可以做到:

enum Result<S, F> {
  case success(S)
  case failure(F)
}

let resultFailure = Result<Int, String>.failure("Error")

var error: String?

if case let Result.failure(value) = resultFailure {
  error = value
}

print(error) // Optional("Error")
给你,1行并使用
let

let error: String? = { if case let .failure(value) = resultFailure { return value }; return nil }()

分别为成功案例和失败案例添加两个计算属性

enum Result<S, F> {
  case success(S)
  case failure(F)

  var successValue: S? {
    switch self {
    case .success(let value):
      return value
    case .failure:
      return nil
    }
  }

  var failureValue: F? {
    switch self {
    case .failure(let value):
      return value
    case .success:
      return nil
    }
  }
}


let resultSuccess = Result<Int, String>.success(1)
let resultFailure = Result<Int, String>.failure("Error")

if let error = resultFailure.failureValue {
  // do something
  print(error)
}
枚举结果{
个案成功
案例失败(F)
var成功值:S{
切换自身{
成功案例(let value):
返回值
案例.失败:
归零
}
}
var故障值:F{
切换自身{
案例失败(let值):
返回值
成功案例:
归零
}
}
}
让resultSuccess=Result.success(1)
让resultFailure=Result.failure(“错误”)
如果let error=resultFailure.failureValue{
//做点什么
打印(错误)
}

我看到的可能是重复的,但我不认为它是重复的,因为那个家伙试图访问关联的值,而不管枚举大小写,所以会出现类型问题,这在我的情况下不应该发生,因为我接受了一个可选的.VojtaRujbr链接的可能副本,它的答案对于这个问题是不被接受的,但是它确实回答了上面提出的问题:这使得我的错误变量没有被初始化,所以我要么必须添加
else
子句,或者将我的错误设置为
var
,而不是
let
,这也很糟糕。请检查:在“考虑的备选方案”部分,有这样一个建议:
let error:String?=(resultFailure case?Result.failure)
是的,使用
var
它可以工作,但这绝对不是我想要的,首先因为它使用4行而不是1行,其次,它使用
var
var
有什么问题,为什么要限制为1行?这些似乎是不使用这种技术的非常武断的理由。因为
var
使其可变,我们从FP知道可变的东西使我们的生活更加困难。至于限制为一行,我希望我的代码是声明性的和简单的,而不是必须指定像分配错误变量这样的步骤。有好的实践,然后有现实世界的解决方案。是的,不变性和简洁性是伟大的目标,但如果它们阻碍了解决方案的实现,那么就必须做出妥协。为了摆脱
var
你可以重新分配一个不可变变量,或者在我添加答案时进行闭包。是的,我想到了最后一个解决方案,感谢你的回答,但显然这不是我想要的=)。是的,这很有效,但正如我之前所说,这将迫使我为每个枚举和每个具有值的案例实现相同的逻辑。
enum Result<S, F> {
  case success(S)
  case failure(F)

  var successValue: S? {
    switch self {
    case .success(let value):
      return value
    case .failure:
      return nil
    }
  }

  var failureValue: F? {
    switch self {
    case .failure(let value):
      return value
    case .success:
      return nil
    }
  }
}


let resultSuccess = Result<Int, String>.success(1)
let resultFailure = Result<Int, String>.failure("Error")

if let error = resultFailure.failureValue {
  // do something
  print(error)
}