2014-09-12 2 views
103

Получение жалобы от компилятора, когда я делаю этокласса «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 ключевого слова, имеющие отношение к этой ошибке, если я не ошибаюсь.

ответ

200

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

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

+10

Грозного синтаксис ошибки imo – Magoo

+0

Код, пожалуйста, код объясняет – Martian2049

3

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

Ключевое слово «optional» относится именно к использованию ?, см. this для получения более подробной информации.

38

Свифта Языка программирования гласит:

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

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

Таким образом, вы можете написать:

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 
    } 

} 
10

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

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

var delegate: AppDelegate 

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

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

+0

Это избавит меня от сообщения об ошибке в случае IBOutlet, но не в случае стандартных переменных. –

+0

Это решает мою проблему. Когда я попытался сделать это: var fetchedResultsController: NSFetchedResultsController У меня возникла ошибка компиляции. Добавлением "!" ошибка исчезла, как, например, var fetchedResultsController: NSFetchedResultsController! – Jervisbay

+0

спасибо за ур анс! Это для меня шпион, я просто знаю «?» к необязательному значению, но «!» Я не знал раньше. Я установил «!» например: var time: NSTimer! – AmyNguyen

1

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

класса ViewController: UIViewController { время вара: 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) 
} 

}

+0

Ясность в вашем ответе не совсем все, но это была моя проблема; Я не указывал опциональность члена var (принудительная/необязательная); как только я это сделал, и скорректированный код позже, ViewController больше не жаловался на отсутствие инициализатора. –

+0

u решил проблему? – AmyNguyen

6

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

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

} 
+0

Спасибо @saneryee, это такая смешная ошибка :) – mgyky

17

Иногда эта ошибка появляется также, когда у вас есть var или let, который не был инициализирован.

Например

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

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

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

так в чем же дело? – Martian2049

+0

могут ли они быть включены в функцию init? – Martian2049

Смежные вопросы