在类中初始化协议

时间:2016-08-05 08:37:05

标签: ios swift xcode protocols swift-protocols

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 EDIT2:没听过视频。

3 个答案:

答案 0 :(得分:1)

这是因为你声明了一个不是可选的常量而且不会初始化它。

  let engine: Engine

你应该用var声明它并使它成为可选项或在你的RandomViewController中写初始化器并在那里初始化你的常量。

<强>更新

实施例

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)
    }
}

答案 1 :(得分:0)

将其更改为以下内容并在使用前对其进行初始化:

var engine: Engine!

答案 2 :(得分:0)

问题是我的结构中的变量在全局范围内导致了问题。每当我尝试将协议用作类型时,它就会抱怨它需要初始化。

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