2014-09-12 47 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