Класс '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 ключевое слово, относящееся к этой ошибке, если я не ошибаюсь.

7 111

7 ответов:

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

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

Язык Программирования 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
    }

}

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

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

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

var delegate: AppDelegate

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

печально, что 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)
    }

}

заменить var appDelegate : AppDelegate? с let appDelegate = UIApplication.sharedApplication().delegate как намекнуто на второй комментируемой строке в viewDidLoad().

ключевое слово "необязательно" относится именно к использованию ? см. этой для более подробной информации.

Я использую Xcode 7 и Swift 2. Последнее, что я сделал:

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

}