考虑这些类:
struct OrderedSet<T: Hashable> {} class Exercise: Hashable {} class StrengthExercise: Exercise {} class CardioExercise: Exercise {}
我想做以下事情:
var displayedExercises = OrderedSet<Exercise>() { didSet { self.tableView.reloadData() } } var cardioExercises = OrderedSet<CardioExercise>() var strengthExercises = OrderedSet<StrengthExercise>() @IBAction func segmentControlChanged(segmentControl: UISegmentedControl) { switch segmentControl.selectedSegmentIndex { case 0: self.displayedExercises = self.strengthExercises case 1: self.displayedExercises = self.cardioExercises default: break } }
但我得到这个错误:
Cannot assign value of type 'OrderedSet<StrengthExercise>' to type 'OrderedSet<Exercise>
我不太明白这一点,因为StrengthExercise是Exercise的子类,并且将包含OrderedSet< Exercise>的所有内容.预计.
问题
>为什么这个错误是必要的?
>如何编写能够实现我想要的功能的东西?
雷达提起
rdar://23608799
关于协方差和逆变的博客文章
https://www.mikeash.com/pyblog/friday-qa-2015-11-20-covariance-and-contravariance.html
解决方法
我担心Swift 2.1目前无法实现这一目标.仅支持以下转换
>内置集合类型的元素类型是协变的.
>支持函数类型之间的转换,展示函数结果类型的协方差和函数参数类型的逆变. (参见Xcode 7.1 Release Notes)
作为Objective-C的泛型支持类型方差,并且考虑到Swift 2.1中函数类型转换的进展,我相信有理由相信将来会向Swift添加类型差异支持.与此同时,请记住提交雷达,如jlieske has.
与此同时,您必须复制集合或使用其中一种内置集合类型.
自Swift成为开源以来的更新:
我相信Swift 3.0 Dev Roadmap的完整泛型部分表明类型差异将在3.0中解决.虽然没有特别指出类型方差,但标准库中的特殊外壳异常(包括类型方差)是.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。