2016-08-05 5 views
0
protocol Engine { 
     func setSpeed(speed: Double) 
} 
struct Car: Engine { 
     let speed: Double 

     func setSpeed(speed: Double) { 

      self.speed = speed 
     } 
} 
class RandomViewController: UIViewController { 
     let engine: Engine 
} 

私はSwiftでプロトコル指向を実演した人のビデオを見ました。私はそれを撮影しました。人はこのようなことをして、エラーを起こさなかったようだ。クラスでプロトコルを初期化する

クラス 'RandomViewController'に初期化子がありません。私はどこから離れていますか?誰かが私を訂正して正しい方向に向けることができますか?

EDIT:ビデオはhttps://youtu.be/-g53kYDIpP4?t=611 EDIT2:ビデオを聞いていませんでした。

答えて

1

これは、オプションではない定数を宣言し、初期化しないためです。

let engine: Engine 

これをvarで宣言して、それをオプションにしたり、初期化子をRandomViewControllerに書き込んでそこの定数を初期化する必要があります。

UPDATE

protocol Engine { 
    mutating func setSpeed(speed: Double) 
} 

struct Car: Engine { 
    var speed: Double = 0 

    mutating func setSpeed(speed: Double) { 
     self.speed = speed 
    } 
} 

class ViewController: UIViewController { 
    let engine:Engine 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     engine = Car(speed: 5); 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     engine = Car(speed: 5); 
     super.init(coder: aDecoder) 
    } 
} 
+0

init(engine:Engine){self.engine = Engine}はViewControllerからinitを実装するように強制します。 – bCM

+0

とにかく、良い解決策ではないようです。私は間違っているかもしれません。 – bCM

+0

これは厳密な型のSwiftです。オプションの定数ではないと宣言した場合は、宣言した場所でinitまたは右辺で初期化する必要があります – Konstantin

0

は以下のように変更して、あなたがそれを使用する前にそれを初期化します。問題は、私は地球上で私の構造体の内部変数を持っていた

var engine: Engine! 
0

問題の原因となるスケール。プロトコルをタイプとして使用しようとしたときはいつでも、それを初期化する必要があります。

私はプロトコルと構造体を分解し、それを私の問題を解決する別の方法で組み立てなければなりませんでした。

関連する問題