2016-08-05 109 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

问题是我有我的结构里面的变量在全球引起问题的规模。每当我试图使用协议作为一种类型,它抱怨它需要被初始化。

我不得不解散协议和结构,并以不同的方式组装它来解决我的问题。