2016-08-05 6 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 
} 

스위프트에서 프로토콜 지향을 시연 한 사람의 비디오를 보았습니다. 그 사람은 이런 식으로 뭔가 잘못한 것 같았습니다.클래스에서 프로토콜 초기화

클래스 '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

문제를 일으키는 규모. 프로토콜을 형식으로 사용하려고 시도 할 때마다 초기화해야합니다.

프로토콜을 분해하고 구조화하고 다른 방법으로 어셈블하여 내 문제를 해결해야했습니다.

관련 문제