新手到斯威夫特。
我正在尝试扩展'Array',它包含已知自定义类型的对象--'Job'。 Job对象包含vars,例如id,creationDate,title等......
我创建了一些这些Job对象的数组,例如
var jobArray: [Job]
然后,我希望做的是
let singleJob = jobArray.job(id: 123)
和
let completedJobs = jobArray.completedJobs()
这似乎是最好的方法,只需通过扩展Array(最好是Array),然后我可以创建一些便利函数来过滤并从数组中返回相应的作业。
我尝试了很多方法,但是我觉得我最接近我想要达到的目标,
extension Array {
func job<T: Job>(id: Int) -> Job? { // Constrains this function to [Job] arrays?
return filter{ ($0 as Job).id == id }[0] as Job
}
}
我希望通过将函数限制为只能处理我可以简单地转换为该类型的特定数组,并按变量进行过滤,而是抱怨“T不能转换为Job”。这是可以理解的,但我也希望能够执行更全局的功能,如下所示;
extension Array {
func availableJobs<T: Job>() -> [Job] {
return filter {
($0 as Job).awarded == nil &&
($0 as Job).completed == nil
} as [Job]
}
}
有没有办法让我的缩短版本工作,或者我是否完全以错误的方式解决这个问题?
我设法通过创建一个新的临时数组,通过手动迭代,然后过滤它来获得传统上冗长的工作,但这一切看起来都是冗长且不必要的。如果我只能扩展Array(对于给定的类型),这一切都会如此简单 - 遗憾的是,它看起来似乎不允许(但是?)。
我很欣赏我可能会试图简化那些不可能的事情;斯威夫特表现出如此多的承诺,但也许我需要等到它再成熟一点?
任何想法?...
感谢您的任何意见。