为什么我一直得到“AnyObject无法构造,因为它没有可访问的初始化器”

时间:2017-05-03 21:45:24

标签: swift anyobject

我一直在youtube上关注一个教程,并在xcode中编写了一个类似app的应用程序并继续返回此错误,该教程使用的是早期版本的swift。我如何移动过去?

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
    }

1 个答案:

答案 0 :(得分:1)

您收到该错误是因为Swift中的AnyObjectProtocol,而不是类,结构或枚举。协议是类的蓝图,您创建符合它的类,但协议本身永远不会被实例化。

至于如何修复它:看起来你正在使用的教程使用与教程here相同的代码。它会为user中的viewDidLoad分配一个值,并在此之后将其视为可选项。所以初始值只是一个永远不会被使用的占位符。

您可以将声明更改为可选,而是为其指定类型但没有值:

var user: AnyObject?

AnyObject 始终在Swift中是Protocol,因此永远不会成为它的实例。那么为什么它在本教程中使用的Swift的早期版本中有效呢?好吧,看起来你的版本中有一个拼写错误。在教程中它看起来像这样:

var user = AnyObject?()

AnyObject?后的问号使其成为Optional类型的AnyObject。在3.0之前的Swift中,Optional有一个init()方法可以创建一个空实例。因此,AnyObject?()Optional类型AnyObject的简写,值设置为nil。在Swift 3中,多余的初始化程序被删除,因此速记不再有效。但只是将变量声明为可选变量具有相同的效果。