【问题标题】:Using switch to assign an instance variable使用 switch 分配实例变量
【发布时间】:2015-10-28 15:01:26
【问题描述】:

如果有任何帮助,我将不胜感激 - 绞尽脑汁好几天,我不明白为什么这不起作用。

基本上,我有一个主视图控制器,它将由不同的类控制,具体取决于用户选择的游戏

'经典' '无限' '定时'

当按下用户按钮时,它需要浏览选项并将类的实例分配给变量'brain'。

这就是我所拥有的:

var brain = GuessMeComparer()

func switcher (random:String) {

switch random {

case "Classic": self.brain = ClassicBrain()
case "unlimited": self.brain = GuessMeComparer()
case "timed": self.brain = TimedBrain()

default:break

}
}

我收到错误消息“无法将“ClassicBrain”类型的值分配给“GuessMeComparer”类型的值。

我能想到的就是不能用switch来赋值实例变量?

任何帮助都会很棒,干杯!

【问题讨论】:

  • 了解这些变量的类型会有所帮助。 GuessMeComparerClassicBrain是同一个前任吗?
  • GuessMeComparerClassicBrainGuessMeComparerTimedBrain 继承自什么?
  • 它们都是自定义类,我没有从任何超类继承,所以不要从任何东西继承......我认为这是我尝试设置“大脑”时遇到的问题

标签: swift switch-statement instance instance-variables


【解决方案1】:

Swift 是一种强类型语言,变量brain 被声明为类型GuessMeComparer
一旦声明,您将无法更改类型。

要考虑不同的类型,请将变量显式声明为泛型类型AnyObject

 var brain : AnyObject = GuessMeComparer()

现在您可以为变量分配不同的类型,但在许多情况下,您必须稍后在代码中将变量强制转换为特定类型。

【讨论】:

    【解决方案2】:

    使用 AnyObject 会起作用,但是 - 正如 vadian 所说 - 会迫使您稍后强制转换为特定类型。更好的选择是在 swift 协议中为所有大脑类抽象一个通用接口,例如:

    protocol BrainProtocol {
       // common interface here
       ...
    }
    
    class /* or struct */ ClassicBrain : BrainProtocol {
        // classic implementation here
        ...
    }
    
    class /* or struct */ TimedBrain : BrainProtocol {
        // timed implementation here
        ...
    }
    
    ...
    
    var brain : BrainProtocol
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多