2017-05-03 54 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中,多余的初始化器被丢弃,所以速记不再起作用。但只是将变量声明为可选,具有相同的效果。

相关问题