我一直在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
}
答案 0 :(得分:1)
您收到该错误是因为Swift中的AnyObject
是Protocol,而不是类,结构或枚举。协议是类的蓝图,您创建符合它的类,但协议本身永远不会被实例化。
至于如何修复它:看起来你正在使用的教程使用与教程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中,多余的初始化程序被删除,因此速记不再有效。但只是将变量声明为可选变量具有相同的效果。