【问题标题】:Xcode: Generic parameter 'T' could not be inferredXcode:无法推断通用参数“T”
【发布时间】:2017-06-09 20:13:01
【问题描述】:

我创建了一个 func counter() 并在其中包含 seconds -= 1 和 label.text。我试图制作一个 if marioButtonPressed(sender: AnyObject) [my button for the app] { seconds += 0 } 但无法推断出通用参数“T”。任何帮助将不胜感激。如果需要,我可以提供更多信息。

 func counter()
{
    seconds -= 1
    label.text = String(seconds) + ""

  *if marioButtonPressed(<#T##sender: AnyObject##AnyObject#>) {seconds += }*
    if (seconds == 0)
    {
        timer.invalidate()

        gameOver.isHidden = false
        UIView.animate(withDuration: 1, animations: {
            self.gameOver.center = CGPoint (x:  self.gameOver.center.x + 500, y: self.gameOver.center.y)})

}
}

我有错误的代码。

另外,如果计时器达到 0,我的按钮将停止工作,我该如何做到这一点?

【问题讨论】:

  • 编辑您的问题以包含marioButtonPressed 的定义。

标签: ios xcode


【解决方案1】:

在您的代码中,sender: AnyObject 仍然是“占位符”。您可以在原始屏幕截图中的蓝色背景/气泡中看到这一点。

选择占位符并将其替换为您希望传递给该函数的对象。

【讨论】:

    【解决方案2】:

    你必须完成这个功能,你的占位符只是为了表明你必须完成这个空间。尝试类似marioButtonPressed(sender:self)

    【讨论】:

      【解决方案3】:

      我想你是这样定义marioButtonPressed的:

      func marioButtonPressed<T: AnyObject>(_ sender: T) -> Bool {
          return true // or whatever
      }
      

      然后你可能试图这样称呼它:

      func counter() {
          // ...
          if marioButtonPressed(nil) { seconds += 1 }
          // ...
      }
      

      这个调用的问题是nil 本身没有完整的类型;这意味着Optional&lt;Something&gt;.none,Swift 从nil 出现的上下文中推断出Something。这里没有足够的信息来推断Something。

      您可以为编译器提供显式类型。对于我上面写的定义,你必须这样做:

          if marioButtonPressed(nil as AnyObject? as AnyObject) { seconds += 1 }
      

      这是一个奇怪的双-as,因为marioButtonPressed 接受T,而不是T?。由于nil as AnyObject? 表示Optional&lt;AnyObject&gt;.none,因此您必须将其包装在非可选的AnyObject 中。

      无论如何,更好的解决方法几乎可以肯定是更改marioButtonPressed 根本不争论。 sender 参数通常用在 @IBAction 方法中,但 @IBAction 方法不能是通用的,不应返回 Bool。所以marioButtonPressed 不能是@IBAction,所以它可能不应该有sender 参数。它应该像这样定义:

      func marioButtonPressed() -> Bool {
          return true // or whatever
      }
      

      它应该这样调用:

          if marioButtonPressed() { seconds += 1 }
      

      或者您甚至可以将其设为这样的属性:

      var marioButtonPressed: Bool {
          return true // or whatever
      }
      

      你可以这样使用它:

          if marioButtonPressed { seconds += 1 }
      

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 2015-09-22
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多