2017-05-03 90 views
1

我一直在關注YouTube上的教程,並在xcode中編寫了類似於應用程序的twitter,並且一直返回此錯誤,本教程使用的是較早版本迅速。我如何移過去呢?爲什麼我總是收到「AnyObject無法構造,因爲它沒有可訪問的初始值設定項」

class HandleViewController: UIViewController { 
    @IBOutlet weak var fullName: UITextField! 
    @IBOutlet weak var handle: UITextField! 
    @IBOutlet weak var startTweeting: UIBarButtonItem! 
    @IBOutlet weak var errorMessage: UILabel! 

    var user = AnyObject() 
    var rootRef = FIRDatabase.database().reference() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.user = FIRAuth.auth()?.currentUser 
    } 
+0

很可能是[Swift 3.0中的UIView?()構造函數發生了什麼?](http://stackoverflow.com/q/39549717/2976878) – Hamish

回答

1

你得到的是錯誤的,因爲AnyObject斯威夫特是一個Protocol,不是類,結構或枚舉。協議是類的藍圖,您可以創建符合它的類,但協議本身不能實例化。

至於如何解決它:它看起來像你正在遵循的教程使用相同的代碼作爲教程here。它將viewDidLoad中的值分配給user,並在此之後將其視爲可選項。所以初始值只是一個永遠不會被使用的佔位符。

可以申報改爲可選的替代,給它一個類型,但沒有價值:

var user: AnyObject? 

AnyObject總是一直在斯威夫特一個Protocol,所以有可能從未是它的一個實例。那麼爲什麼它在本教程中使用的Swift的早期版本中工作?對一個人來說,它看起來像你的版本有一個錯字。在本教程中,它看起來是這樣的:

var user = AnyObject?() 

AnyObject?後的問號使得AnyObject類型的Optional。在3.0之前的Swift中,Optional有一個init()方法可以創建一個空實例。因此AnyObject?()是類型的新Optional的簡寫,值設置爲零。在Swift 3中,多餘的初始化器被丟棄,所以速記不再起作用。但只是將變量聲明爲可選,具有相同的效果。

相關問題