2014-09-12 34 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 2016-09-14 09:54:53

+0

代码请解释,代码说明 – Martian2049 2017-09-19 02:25:59

3

替换var appDelegate : AppDelegate?let appDelegate = UIApplication.sharedApplication().delegate暗示在第二条注释行viewDidLoad()

关键字“可选”指的是使用?,详见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!,使其可选,存储零,直到该值被用来不解开的变量。

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

+0

这确实为我摆脱了IBOutlet的错误消息,但不是在标准变量的情况下。 – 2015-12-24 21:52:38

+0

这解决了我的问题。当我试图做到这一点:var fetchedResultsController:NSFetchedResultsController我得到了编译错误。通过增加 ”!”错误消失了,就像var fetchedResultsController:NSFetchedResultsController! – Jervisbay 2016-03-05 23:23:58

+0

感谢您的答复!这对我来说很有帮助,我只知道“?”到可选值但“!”我以前不知道。我设置 ”!”像那样:var time:NSTimer! – AmyNguyen 2016-04-01 04:14:00

1

我使用的Xcode 7和斯威夫特2.去年,我做了:

类的ViewController:UIViewController的{VAR 时间://的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不再抱怨没有初始化器。 – 2016-06-17 20:13:56

+0

你已经解决了问题? – AmyNguyen 2016-07-28 04:54:38

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 2016-10-13 06:47:40

17

有时,当你有一个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 
} 
+0

那么有什么解决方案呢? – Martian2049 2017-09-19 02:26:26

+0

它们可以在init函数中被调用吗? – Martian2049 2017-09-19 02:26:48