【问题标题】:Swift : Error: 'required' initializer 'init(coder:)' must be provided by subclass of 'UIView'Swift:错误:'必需'初始化程序'init(coder :)'必须由'UIView'的子类提供
【发布时间】:2016-02-07 15:40:48
【问题描述】:

我在 swift 2 中构建应用时遇到问题。Xcode 说:

'required'初始化器'init(coder:)'必须由'UIView'的子类提供

这是类的代码:

class creerQuestionnaire: UIView {
  @IBOutlet weak var nomQuestionnaire: UITextField!
  @IBOutlet weak var question: UITextField!
  @IBOutlet weak var reponse: UITextField!
  var QR: Questionnaire

  @IBAction func creerQuestion(sender: AnyObject) {
    QR.ajouterQuestion(question.text!, nouvReponse: reponse.text!)
  }
}

这是班级问卷:

import Foundation

class Questionnaire {
  var QR = [String(), String()]

  func getQuestion(nbQuestion: Int) ->String {
    return QR[nbQuestion]
  }

  func getReponse(nbReponse: Int) ->String {
    return QR[nbReponse]
  }

  func ajouterQuestion(nouvQuestion: String, nouvReponse: String) {
    QR += [nouvQuestion, nouvReponse]
  }
}

谢谢!

【问题讨论】:

    标签: ios iphone swift


    【解决方案1】:

    required注意事项:在类初始化器定义之前写 required 修饰符,表示该类的每个子类都必须实现该初始化器。

    override 的注意事项:在重写父类指定的初始化器时,您总是要编写 override 修饰符,即使您的子类的初始化器实现是便利初始化器。

    以上两篇笔记均来自:Swift Programming Language/Initialization

    因此,您的 UIView 子类应该类似于下面的示例:

    class MyView: UIView {
        ...
        override init(frame: CGRect) {
            super.init(frame: frame)
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
        ...
    }
    

    【讨论】:

    • 为什么一个是override 而另一个是required
    • @MichaelDautermann 我刚刚添加了一些关于必需和覆盖的信息。感谢您的突出显示。
    • 感谢回复!
    【解决方案2】:

    根据最新的swift语法,init方法需要添加方法:

    required init?(coder aDecoder: NSCoder) 
    {
             fatalError("init(coder:) has not been implemented")
    }
    

    【讨论】:

      【解决方案3】:

      此代码的一些 cmets:

      var QR = [String(), String()]
      

      var 名称应以小写开头:var qr

      您想用 2 个空字符串进行初始化吗?在您的代码中,您会在初始化时获得 ["", ""]。 这个数组用起来不是很方便,因为你按顺序混合问题和答案。

      创建一对数组可能会更好:

      var qr : [(q: String, r: String) = [] // initiated as empty
      

      您可以通过以下方式访问其组件:qr[i].q 和 qr[i].r

      您需要测试 nbQuestion 是否在界限内;使用之前的 qr 定义,那就是

      func getQuestion(nbQuestion: Int) ->String {
          if nbQuestion < 0 || nbQuestion >= qr.count { return "" }
          return qr[nbQuestion].q
      }
      

      注意:对于给定的 qr,nbReponse 和 nbQuestion 共享相同的值

      func getReponse(nbReponse: Int) ->String {
         if nbReponse < 0 || nbReponse >= qr.count { return "" }
            return qr[nbReponse].r
      }
      
      func ajouterQuestion(nouvQuestion: String, nouvReponse: String) {
          qr += [(nouvQuestion, nouvReponse)]
      }
      

      【讨论】:

      • 对于qr,该类型应该是[(q: String, r: String)] - 你缺少一个括号
      【解决方案4】:

      非可选变量必须用值初始化...

      或者将 QR 声明为可选

      var QR: Questionnaire?
      

      或者初始化它:

      var QR: Questionnaire = Questionnaire()
      

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2014-09-29
        • 2019-11-26
        • 1970-01-01
        相关资源
        最近更新 更多