标签: associated-value

如何使带有关联值的Swift枚举可等于

我有一个关联值的枚举,为了进行测试,我想使其相等,但不知道这种模式如何适用于带有多个参数的枚举实例。

例如,总结如下,我知道使标题相等的语法。对于包含多个不同类型值的选项,这将如何工作?

enum ViewModel {
    case heading(String)
    case options(id: String, title: String, enabled: Bool)
}

func ==(lhs: ViewModel, rhs: ViewModel) -> Bool {
    switch (lhs, rhs) {
    case (let .heading(lhsString), let .heading(rhsString)):
        return lhsString == rhsString
    case options...
    default:
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道Swift 4.1可以为我们合成Equatable的一致性,但是目前我无法更新到该版本。

enums swift equatable associated-value

14
推荐指数
3
解决办法
5218
查看次数

将"或"逻辑与多个"if case"语句一起使用

假设我有一个带有关联值的枚举案例,以及该枚举类型的两个变量:

enum MyEnum {
    case foo, bar(_ prop: Int)
}

let var1 = MyEnum.foo
let var2 = MyEnum.bar(1)
Run Code Online (Sandbox Code Playgroud)

如果我想检查两个变量是否与关联值的一般情况匹配,我可以用逗号来做:

if case .bar = var1, case .bar = var2 {
    print("both are bar")
}
Run Code Online (Sandbox Code Playgroud)

但是,我需要检查,如果两种情况相匹配,像这样的东西:

if case .bar = var1 || case .bar = var2 {
    print("at least one is bar")
}
Run Code Online (Sandbox Code Playgroud)

但是,这不编译.是否有另一种方法来编写这个以使逻辑工作?

enums boolean-logic swift associated-value

10
推荐指数
4
解决办法
1273
查看次数

Swift - 在枚举数组中查找具有关联值的对象

我有这个枚举:

enum Animal {       
    case cat(CatModel)
    case dog(DogModel)
}
Run Code Online (Sandbox Code Playgroud)

还有一系列动物:

var animals: [Animal]
Run Code Online (Sandbox Code Playgroud)

我需要通过 Dog 没有的属性在该数组中找到 Cat 对象。litterBoxId例如。

let cat = animals.first(where: {$0.litterBoxId == 7})
Run Code Online (Sandbox Code Playgroud)

这当然有一个错误:

Value of type 'MyViewController.Animal' has no member 'litterBoxId'
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我也尝试过

($0 as CatModel).litterBoxId
Run Code Online (Sandbox Code Playgroud)

arrays search enums swift associated-value

6
推荐指数
1
解决办法
2029
查看次数

在 Swift 中使用枚举设计错误类型

也许我只是完全想多了,但我正在尝试使用枚举来处理来自我正在集成的 API 的错误。

从这个 API 的 swagger 文档中,我可以看到可以返回的所有可能的响应。我已经把这些写成一个BaseError枚举:

enum BaseError: Error {
    case badRequest // 400
    case unauthorized // 401
    case forbidden // 403
    case unhandledError // XXX
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在在我的客户端是我的问题开始的地方。

我最初的希望是采用这个BaseError枚举并根据我所在的客户扩展/添加其他案例。

就像是:

enum ClientSpecificError: BaseError {
    case clientError
}
Run Code Online (Sandbox Code Playgroud)

这将允许我返回一个错误 ClientSpecificError.unauthorized


现在我知道这是不可能的,因为枚举不能继承其他枚举,但我对如何实现这一点缺少一些理解。

问题

有没有其他方法可以使用枚举来实现这一点?

这甚至是“最佳实践”吗?

error-handling enums ios swift associated-value

5
推荐指数
1
解决办法
806
查看次数

带有类的枚举上的S​​wift Switch case

这是我第一次使用这种枚举,带有关联值类型的枚举,我需要switch根据对象的类型进行声明,我无法做到,这是枚举:

enum TypeEnum {
    case foo(FooClass)
    case doo(DooClass)
    case roo(RooClass)
}
Run Code Online (Sandbox Code Playgroud)

我的对象有一个类型的变量TypeEnum,现在我需要检查枚举中的对象类型:

if let anObject = object as? TypeEnum {

  switch anObject {
  case .foo(???):
     return true
    ...
    default:
      return false
    }

 }
Run Code Online (Sandbox Code Playgroud)

我不知道用什么代替???. Xcode 告诉我放一些东西,但我只想打开.foo.

有任何想法吗?

enums switch-statement swift associated-value

2
推荐指数
1
解决办法
1034
查看次数

SwiftUI 中的关联枚举状态

如何在 SwiftUI@Stateif语句中使用关联的枚举作为变量?

struct ProfileView: View {
    @State private var choice = Choice.simple

    private enum Choice {
        case simple
        case associated(Int)
    }

    var body: some View {
        if choice == .simple {
            Text("Simple")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器报这个错误:

协议“Equatable”要求“ProfileView.Choice”符合“Equatable”

enums swift associated-value swiftui

2
推荐指数
2
解决办法
1870
查看次数