如何解决Swift-在具有关联值的枚举数组中查找对象
我有这个枚举:
enum Animal {
case cat(CatModel)
case dog(DogModel)
}
还有一系列动物:
var animals: [Animal]
我需要通过Dog没有的属性在此数组中找到Cat对象。例如litterBoxId
。
let cat = animals.first(where: {$0.litterBoxId == 7})
这当然有一个错误:
Value of type 'MyViewController.Animal' has no member 'litterBoxId'
我该怎么做?我也尝试过
($0 as CatModel).litterBoxId
解决方法
这可能不是枚举的很好用,但是这是可能的工作方式:
struct CatModel {
let litterBoxID: Int
}
struct DogModel {
let litterBoxID: Int
}
enum Animal {
case cat(CatModel)
case dog(DogModel)
var litterBoxId: Int {
switch self {
case .cat(let cat): return cat.litterBoxID
case .dog(let dog): return dog.litterBoxID
}
}
}
var animals: [Animal] = []
let cat = animals.first(where: { $0.litterBoxId == 7 })
使用协议会更好:
struct CatModel: Animal {
let litterBoxID: Int
}
struct DogModel: Animal {
let litterBoxID: Int
}
protocol Animal {
var litterBoxID: Int { get }
}
var animals: [Animal] = []
let cat = animals.first(where: { $0.litterBoxID == 7 })
,
您可以使用模式匹配以两种方式完成此操作。
使用开关:
let cat = animals.first(where: {
switch $0 {
case .cat(let catModel) where catModel.litterBoxId == 7:
return true
default:
return false
}
})
或者如果:
let cat = animals.first(where: {
if case .cat(let catModel) = $0,catModel.litterBoxId == 7 {
return true
}
return false
})
更新:正如@ Alexander-ReinstateMonica在其通讯中提到的那样,将这种逻辑隐藏在这样的函数后面更为合适:
extension Animal {
func matches(litterboxID: Int) -> Bool {
switch self {
case .cat(let catModel) where catModel.litterBoxId == 7:
return true
default:
return false
}
}
}
然后您的代码将更加简洁:
let cat = animals.first(where: { $0.matches(litterboxID: 7) })
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。