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