Obtenir la plainte du compilateur quand je le fais
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) {
}
}
Cependant, si je viens d'ajouter ? à la fin de AppDelegate comme ci-dessous et l'erreur disparaît.
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) {
}
}
Je ne vois pas optional
mot-clé pertinent pour cette erreur, sauf si je me trompe.
L'erreur pourrait être améliorée, mais le problème avec votre première version est que vous avez une variable membre, delegate
, qui n'a pas de valeur par défaut. Toutes les variables de Swift doivent toujours avoir une valeur. Cela signifie que vous devez le configurer dans un initialiseur que vous n'avez pas ou vous pouvez lui fournir une valeur par défaut en ligne.
Lorsque vous le rendez facultatif, vous lui permettez d'être nil
par défaut, ce qui vous évite d'avoir à lui donner explicitement une valeur ou à l'initialiser.
Le Swift Langage de programmation indique:
Les classes et les structures doivent définir toutes les propriétés stockées sur une valeur initiale appropriée au moment de la création d'une instance de cette classe ou de cette structure. Les propriétés stockées ne peuvent pas être laissées dans un état indéterminé.
Vous pouvez définir une valeur initiale pour une propriété stockée dans un initialiseur ou en attribuant une valeur de propriété par défaut dans le cadre de la définition de la propriété.
Par conséquent, vous pouvez écrire:
class myClass {
var delegate: AppDelegate //non-optional variable
init() {
delegate = UIApplication.sharedApplication().delegate as AppDelegate
}
}
Ou:
class myClass {
var delegate = UIApplication.sharedApplication().delegate as AppDelegate //non-optional variable
init() {
println("Hello")
}
}
Ou:
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
}
}
Mais vous ne pouvez pas écrire ce qui suit:
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
}
}
Parfois, cette erreur apparaît également lorsque vous avez une variable ou un let qui n’a pas été initialisé.
Par exemple
class ViewController: UIViewController {
var x: Double
// or
var y: String
// or
let z: Int
}
Selon ce que votre variable est censée faire, vous pouvez définir ce type de variable comme facultatif ou l'initialiser avec une valeur comme celle-ci.
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
}
Ce problème apparaît généralement lorsqu'une de vos variables n'a aucune valeur ou lorsque vous oubliez d'ajouter "!" pour forcer cette variable à stocker nil jusqu'à ce qu'elle soit définie.
Dans votre cas, le problème est ici:
var delegate: AppDelegate
Il doit être défini comme var delegate: AppDelegate!
pour en faire une option qui stocke nil et ne décompresse pas la variable tant que la valeur n'est pas utilisée.
Il est regrettable que Xcode mette en évidence l’erreur de la classe entière au lieu de mettre en évidence la ligne de code qui l’a provoquée. Il faut donc un certain temps pour la comprendre.
si vous avez perdu un "!" Dans votre code, comme ce code ci-dessous, vous obtiendrez également cette erreur.
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)
}
}
Remplacez var appDelegate : AppDelegate?
par let appDelegate = UIApplication.sharedApplication().delegate
comme indiqué sur la deuxième ligne commentée de viewDidLoad()
.
Le mot clé "facultatif" fait référence à l'utilisation de ?
, voir this pour plus de détails.
J'utilise Xcode 7 et Swift 2. Enfin, j'avais fait:
class ViewController: UIViewController {heure var: NSTimer // erreur ceci ici}
Ensuite, je répare: classe 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)
}
}
Pour moi était une déclaration incomplète. Par exemple:
var isInverted: Bool
Au lieu de la bonne façon:
var isInverted: Bool = false