2017-05-03 11 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

スウィフトでAnyObjectProtocol、クラスではなく、構造、または列挙型であるので、あなたはそのエラーを取得しています。プロトコルはクラスの青写真の一種であり、それに準拠するクラスを作成しますが、プロトコル自体は決してインスタンス化できません。

修正方法:チュートリアルでチュートリアルhereと同じコードを使用しているようです。 userの値をviewDidLoadに割り当て、それ以降はオプションとして扱います。したがって、初期値は決して使用されないプレースホルダに過ぎません。

は、あなたはそれをタイプが、値なし与え、代わりにオプションの宣言を変更することができます。

var user: AnyObject? 

AnyObjectは、常にはスウィフトでProtocolされましたので、そこがあることができませんでしたそれのインスタンス。では、チュートリアルで使用していたSwiftの以前のバージョンではなぜ機能しましたか?まあ、あなたのバージョンにはタイプミスがあるようです。 AnyObject?はそれをタイプAnyObjectOptional落札後

var user = AnyObject?() 

疑問符:チュートリアルでは、このようになります。 3.0より前のSwiftでは、Optionalは、空のインスタンスを作成するメソッドinit()を持っていました。したがって、AnyObject?()はタイプの新しいOptionalの省略形です。値はnilに設定されています。 Swift 3では余分なイニシャライザが削除されたので、省略しても機能しなくなりました。しかし、変数をオプションとして宣言するだけでも同じ効果が得られます。

関連する問題