Класс "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) {
    }
}

Однако, если я просто добавлю? в конце 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, относящееся к этой ошибке, если я ошибаюсь.

Ответ 1

Ошибка может быть улучшена, но проблема с вашей первой версией заключается в том, что у вас есть переменная-член, delegate, которая не имеет значения по умолчанию. Все переменные в Swift всегда должны иметь значение. Это означает, что вы должны установить его в инициализаторе, которого у вас нет, или вы можете указать его значение по умолчанию в строке.

Если вы сделаете это необязательным, вы позволяете ему быть nil по умолчанию, устраняя необходимость явно указывать ему значение или инициализировать его.

Ответ 2

Язык быстрого языка:

Классы и структуры должны устанавливать все свои сохраненные свойства в соответствующее начальное значение к моменту экземпляра этого класса или структура создана. Сохраненные свойства не могут быть оставлены в неопределенное состояние.

Вы можете установить начальное значение для сохраненного свойства в пределах инициализатор или присвоение значения свойства по умолчанию как части определение свойств.

Поэтому вы можете написать:

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
    }

}

Ответ 3

Иногда эта ошибка также появляется, когда у вас есть 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
}

Ответ 4

Эта проблема обычно возникает, когда одна из ваших переменных не имеет значения или когда вы забыли добавить "!" чтобы заставить эту переменную хранить nil до тех пор, пока она не будет установлена.

В вашем случае проблема здесь:

var delegate: AppDelegate

Он должен быть определен как var delegate: AppDelegate!, чтобы сделать его опционным, который сохраняет nil и не разворачивает переменную до тех пор, пока значение не будет использовано.

Печально, что Xcode выделяет весь класс как ошибку, а не выделяет конкретную строку кода, вызвавшую его, поэтому требуется время, чтобы понять это.

Ответ 5

если вы потеряли "!" в вашем коде, как этот код ниже, вы также получите эту ошибку.

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

}

Ответ 6

Замените var appDelegate : AppDelegate? на let appDelegate = UIApplication.sharedApplication().delegate, как намекнул на вторую прокомментированную строку в viewDidLoad().

Ключевое слово "optional" относится именно к использованию ?, более подробно см. this.

Ответ 7

Я использую Xcode 7 и Swift 2. Наконец, я сделал:

класс 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)
}

}

Ответ 8

Для меня это была неполная декларация. Например:

var isInverted: Bool

Вместо правильного пути:

var isInverted: Bool = false