2016-08-05 99 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'沒有初始值設定項。我在哪裏?有人能糾正我,並指出我在正確的方向嗎?

編輯:視頻是https://youtu.be/-g53kYDIpP4?t=611 編輯2:沒有通過視頻聽。

回答

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}迫使我從視圖控制器實現一個init。 – bCM

+0

無論如何,似乎並不是一個好的解決方案。我可能錯了。 – bCM

+0

這是一個嚴格的Swift類型,如果你聲明它不是可選常量,那麼你必須在init或right中初始化它,因爲你聲明它 – Konstantin

0

其更改如下,並在使用它之前初始化:

var engine: Engine! 
0

問題是我有我的結構裏面的變量在全球引起問題的規模。每當我試圖使用協議作爲一種類型,它抱怨它需要被初始化。

我不得不解散協議和結構,並以不同的方式組裝它來解決我的問題。