当我这样做时,从编译器获取投诉
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
关键字。
答案 0 :(得分:229)
错误可以改进,但是您的第一个版本的问题是您有一个成员变量delegate
,它没有默认值。 Swift中的所有变量必须始终具有值。这意味着你必须在你没有的初始化程序中进行设置,或者你可以在线提供默认值。
当您将其设为可选项时,默认情况下允许它为nil
,无需明确地为其赋值或初始化它。
答案 1 :(得分:44)
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
}
}
答案 2 :(得分:22)
有时,当你有一个没有初始化的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
}
答案 3 :(得分:12)
当您的某个变量没有值时,通常会出现此问题 或者当你忘记添加"!"强制此变量存储nil直到设置为止。
在你的情况下,问题在于:
var delegate: AppDelegate
应将其定义为var delegate: AppDelegate!
,使其成为存储nil的可选项,并且在使用该值之前不要解包该变量。
令人遗憾的是,Xcode将整个类强调为错误,而不是突出显示导致它的特定代码行,因此需要一段时间才能弄明白。
答案 4 :(得分:10)
如果你输了“!”在您的代码中,如下面的代码,您也会收到此错误。
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)
}
}
答案 5 :(得分:3)
将var appDelegate : AppDelegate?
替换为
let appDelegate = UIApplication.sharedApplication().delegate
在viewDidLoad()
的第二条注释行中暗示{。}}。
关键字“可选”完全是指?
的使用,有关详细信息,请参阅this。
答案 6 :(得分:1)
我使用Xcode 7和Swift 2.最后,我做了:
class 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)
}
}
答案 7 :(得分:0)
对我来说,声明不完整。例如:
var isInverted: Bool
相反,正确的方法:
var isInverted: Bool = false