类“ ViewController”没有快速初始化器

当我这样做的时候从编译器得到抱怨

class ViewController: UIViewController {


var delegate : AppDelegate
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//self.appDelegate = UIApplication.sharedApplication().delegate;


}


@IBAction func getData(sender : AnyObject) {


}


@IBAction func LogOut(sender : AnyObject) {
}
}

但是,如果我像下面这样在 应用代理的末尾添加 ?,那么错误就消失了。

class ViewController: UIViewController {


var delegate : AppDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//self.appDelegate = UIApplication.sharedApplication().delegate;


}


@IBAction func getData(sender : AnyObject) {


}


@IBAction func LogOut(sender : AnyObject) {
}
}

除非我错了,否则我看不到与此错误相关的 optional关键字。

136074 次浏览

var appDelegate : AppDelegate?替换为 let appDelegate = UIApplication.sharedApplication().delegate,如 viewDidLoad()中第二行注释所示。

关键字“可选”正是指使用 ?,请参阅 this了解更多细节。

这个错误可以得到改进,但是第一个版本的问题是有一个成员变量 delegate,它没有默认值。Swift 中的所有变量必须始终有一个值。这意味着您必须在一个初始化器中设置它,而这个初始化器是您没有的,或者您可以在内联中为它提供一个默认值。

当您将其设置为可选时,默认情况下允许其为 nil,这样就不需要显式地给它赋值或初始化它。

迅速编程语言 声明:

类和结构必须将其所有存储属性设置为 在该类的实例或 存储属性不能保留在 不确定状态。

中设置存储属性的初始值 initializer, or by assigning a default property value as part of the 财产的定义。

因此,你可以写:

class myClass {


var delegate: AppDelegate //non-optional variable


init() {
delegate = UIApplication.sharedApplication().delegate as AppDelegate
}


}

或者:

class myClass {


var delegate = UIApplication.sharedApplication().delegate as AppDelegate //non-optional variable


init() {
println("Hello")
}


}

或者:

class myClass {


var delegate : AppDelegate! //implicitly unwrapped optional variable set to nil when class is initialized


init() {
println("Hello")
}


func myMethod() {
delegate = UIApplication.sharedApplication().delegate as AppDelegate
}


}

但是你不能写下面的内容:

class myClass {


var delegate : AppDelegate //non-optional variable


init() {
println("Hello")
}


func myMethod() {
//too late to assign delegate as an non-optional variable
delegate = UIApplication.sharedApplication().delegate as AppDelegate
}


}

这个问题通常在您的变量之一没有值时出现 或者当您忘记添加“ !”来强制这个变量存储 nil,直到它被设置。

对你来说,问题就在这里:

var delegate: AppDelegate

它应该定义为 var delegate: AppDelegate!,使其成为一个可选的,存储 nil 并且在使用该值之前不打开变量。

令人遗憾的是,Xcode 将整个类高亮显示为一个错误,而不是高亮显示造成错误的特定代码行,因此需要一段时间才能弄清楚。

I use Xcode 7 and Swift 2. Last, I had made:

类 ViewController: UIViewController { Var time: NSTimer//error this here }

Then I fix: 类 ViewController: UIViewController {

var time: NSTimer!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}


override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}


override func viewWillAppear(animated: Bool) {
//self.movetoHome()
time = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(ViewController.movetoHome), userInfo: nil, repeats: false)
//performSegueWithIdentifier("MoveToHome", sender: self)
//presentViewController(<#T##viewControllerToPresent: UIViewController##UIViewController#>, animated: <#T##Bool#>, completion: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>)
}


func movetoHome(){
performSegueWithIdentifier("MoveToHome", sender: self)
}

}

如果您在代码中丢失了一个“ !”,就像下面的代码一样,您也会得到这个错误。

import UIKit


class MemeDetailViewController : UIViewController {


@IBOutlet weak var memeImage: UIImageView!


var meme:Meme! // lost"!"


override func viewWillAppear(animated: Bool) {


super.viewWillAppear(animated)
self.memeImage!.image = meme.memedImage
}


override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
}


}

有时,当有一个 var 或 let 尚未初始化时,也会出现此错误。

比如说

class ViewController: UIViewController {
var x: Double
// or
var y: String
// or
let z: Int
}

根据变量的功能,您可以将 var 类型设置为可选类型,或者使用如下值初始化它

class ViewController: UIViewCOntroller {
// Set an initial value for the variable
var x: Double = 0
// or an optional String
var y: String?
// or
let z: Int = 2
}

对我来说,这是一个不完整的声明,例如:

var isInverted: Bool

而是正确的方式:

var isInverted: Bool = false