类“ViewController”在swift中没有初始化器

当我这样做的时候从编译器得到投诉

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

但是,如果我只是添加 在下面的AppDelegate结束,错误消失了。

 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关键字。

错误可以被改善,但是你的第一个版本的问题是你有一个没有默认值的成员variablesdelegate 。 Swift中的所有variables都必须有一个值。 这意味着你必须在一个你没有的初始化器中设置它,或者你可以在内部提供一个默认值。

当你使它成为可选项时,你可以默认nil ,不需要明确给它一个值或者初始化它。

Swift编程语言指出:

在创build该类或结构的实例时,类和结构必须将其存储的所有属性设置为适当的初始值。 存储的属性不能处于不确定的状态。

您可以在初始化程序中为存储的属性设置初始值,或者通过将默认属性值指定为属性定义的一部分。

因此,你可以写:

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

有时,当你有一个var或一个没有被初始化的let时,这个错误也会出现。

例如

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

根据你的variables应该做什么,你可以将vartypes设置为可选项,或者用下面的值初始化它

 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 } 

这个问题通常出现在你的一个variables没有任何价值的时候,或者你忘记添加“!” 强制这个variables存储零直到它被设置。

在你的情况下,问题在这里:

 var delegate: AppDelegate 

它应该被定义为var delegate: AppDelegate! 使它成为一个可选项,存储零,并不打开variables,直到使用该值。

Xcode将整个类强调为一个错误,而不是突出显示导致它的特定代码行,这是很可悲的,所以需要一段时间才能弄明白。

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

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

replacevar appDelegate : AppDelegate? let appDelegate = UIApplication.sharedApplication().delegate作为在viewDidLoad()的第二个注释行暗示。

关键字“可选”恰恰指的是使用? ,看到这个更多的细节。

我使用Xcode 7和Swift 2.最后,我做了:

class ViewController:UIViewController {var time:NSTimer //这里错误}

然后我修复:类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) } 

}