【发布时间】:2019-10-19 22:29:22
【问题描述】:
我想分配一个 子类 (TapWhatYouHearViewController),它继承自它的父类 (BaseLectureViewController ) 使用继承的类型 (TapWhatYouHear) 将泛型实现到父类 (BaseLectureViewController 类型的变量) 具有 基类 (Game) 类型的泛型。
Swift 产生以下错误:
Swift:: 错误:无法将类型“TapWhatYouHearViewController”的值分配给类型“BaseLectureViewController?”
我读过,一个解决方案,例如在 Java 中将使用通配符泛型,但这在 Swift 中是不可能的。 还有其他解决方案吗?
这是我的设置:
/** GAME TYPES **/
enum GameType {
case TapWhatYouHear,
case ChooseTranslation
}
class Game {
var title: String?
var type: GameType?
}
class TapWhatYouHear : Game {
var audio: String?
var type: GameType = GameType.TapWhatYouHear
}
class ChooseTranslation : Game {
var video: String?
var type: GameType = GameType.ChooseTranslation
}
/** VIEW CONTROLLERS **/
class BaseLectureViewController<T: Game> {
var game: T?
}
class TapWhatYouHearViewController : BaseLectureViewController<TapWhatYouHear> {
}
class ChooseTranslationViewController : BaseLectureViewController<ChooseTranslation> {
}
我想做以下事情:
var game: Game = TapWhatYouHear() // <-- Depending on the user interaction, this can be any sub class of "Game"
var viewController: BaseLectureViewController<Game>
switch game.type {
case .ChooseTranslation:
viewController = TapWhatYouHearViewController() // <--Swift:: Error: cannot assign value of type 'TapWhatYouHearViewController' to type 'BaseLectureViewController<Game>?'
case .TapWhatYouHear:
viewController = ChooseTranslationViewController()
}
viewController.game = TapWhatYouHear()
我要做的是在运行时确定BaseLectureViewController 的哪个子类应该分配给viewController 变量。为了节省代码,我想将Game 类型的游戏分配给BaseLectureViewController 的game 属性。
【问题讨论】:
-
你有必要使用泛型吗?你想做什么,也许有更简单的方法?
-
对于
ChooseTranslationViewController类,您指定game属性应为ChooseTranslation,那么为什么稍后要将TapWhatYouHear分配给game属性?但是,如果您只知道ChooseTranslationViewController中Game类的title属性,您可以将属性实现为var game: Game,而不是使用泛型 -
@mag_zbc @Saik0s :我更新了我的问题。请看底部的代码和解释。 @Saik0s:我的问题不是关于
Game的具体类型,而是关于将特定的视图控制器分配给父类类型的变量。
标签: ios swift generics inheritance