Class' ViewController'在swift中没有初始化器

时间:2014-09-12 15:20:29

标签: swift xcode6 swift-playground

当我这样做时,从编译器获取投诉

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

8 个答案:

答案 0 :(得分:229)

错误可以改进,但是您的第一个版本的问题是您有一个成员变量delegate,它没有默认值。 Swift中的所有变量必须始终具有值。这意味着你必须在你没有的初始化程序中进行设置,或者你可以在线提供默认值。

当您将其设为可选项时,默认情况下允许它为nil,无需明确地为其赋值或初始化它。

答案 1 :(得分:44)

Swift编程语言表明:

  

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

     

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

因此,你可以写:

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
    }

}

答案 2 :(得分:22)

有时,当你有一个没有初始化的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
}

答案 3 :(得分:12)

当您的某个变量没有值时,通常会出现此问题 或者当你忘记添加"!"强制此变量存储nil直到设置为止。

在你的情况下,问题在于:

var delegate: AppDelegate

应将其定义为var delegate: AppDelegate!,使其成为存储nil的可选项,并且在使用该值之前不要解包该变量。

令人遗憾的是,Xcode将整个类强调为错误,而不是突出显示导致它的特定代码行,因此需要一段时间才能弄明白。

答案 4 :(得分:10)

如果你输了“!”在您的代码中,如下面的代码,您也会收到此错误。

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

}

答案 5 :(得分:3)

var appDelegate : AppDelegate?替换为 let appDelegate = UIApplication.sharedApplication().delegateviewDidLoad()的第二条注释行中暗示{。}}。

关键字“可选”完全是指?的使用,有关详细信息,请参阅this

答案 6 :(得分:1)

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

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

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

}

答案 7 :(得分:0)

对我来说,声明不完整。例如:

var isInverted: Bool

相反,正确的方法:

var isInverted: Bool = false