Swift:错误:“必需”初始化程序“init(coder:)”必须由“UIView”的子类提供

问题描述 投票:0回答:4

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

“必需”初始化程序“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
4个回答
26
投票

注意required:在类初始值设定项的定义之前写入 required 修饰符,以指示该类的每个子类都必须实现该初始值设定项。

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

以上两条注释均引用自:Swift 编程语言/初始化

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

class MyView: UIView {
    ...
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    ...
}

3
投票

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

required init?(coder aDecoder: NSCoder) 
{

    fatalError("init(coder:) has not been implemented")
}

1
投票

对此代码的一些注释:

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

变量名称应以小写字母开头:var qr

你想用 2 个空字符串初始化吗?在您的代码中,您在 init 处得到 ["", ""]。 这个数组使用起来不太方便,因为你按顺序混合了问题和答案。

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

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)]
}

-1
投票

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

将 QR 声明为可选

var QR: Questionnaire?

或初始化它:

var QR: Questionnaire = Questionnaire()
© www.soinside.com 2019 - 2024. All rights reserved.