Swift:错误:'必需'初始化程序'init(coder :)'必须由'UIView'的子类提供
Posted
技术标签:
【中文标题】Swift:错误:\'必需\'初始化程序\'init(coder :)\'必须由\'UIView\'的子类提供【英文标题】: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]
谢谢!
【问题讨论】:
【参考方案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()
【讨论】:
以上是关于Swift:错误:'必需'初始化程序'init(coder :)'必须由'UIView'的子类提供的主要内容,如果未能解决你的问题,请参考以下文章
json.swift 错误是 Self.init 在委托初始化程序中的所有路径上都没有调用
Swift:在从初始化程序返回之前,不会在所有路径上调用“super.init”?