我有一个关联值的枚举,为了进行测试,我想使其相等,但不知道这种模式如何适用于带有多个参数的枚举实例。
例如,总结如下,我知道使标题相等的语法。对于包含多个不同类型值的选项,这将如何工作?
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的一致性,但是目前我无法更新到该版本。
假设我有一个带有关联值的枚举案例,以及该枚举类型的两个变量:
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)
但是,这不编译.是否有另一种方法来编写这个以使逻辑工作?
我有这个枚举:
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) 也许我只是完全想多了,但我正在尝试使用枚举来处理来自我正在集成的 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
现在我知道这是不可能的,因为枚举不能继承其他枚举,但我对如何实现这一点缺少一些理解。
有没有其他方法可以使用枚举来实现这一点?
这甚至是“最佳实践”吗?
这是我第一次使用这种枚举,带有关联值类型的枚举,我需要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.
有任何想法吗?
如何在 SwiftUI@State的if语句中使用关联的枚举作为变量?
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”