2014-10-09 28 views
3

爲什麼下面的代碼有錯誤編譯: 「T」不能建造,因爲它沒有可訪問的初始化斯威夫特泛型:沒有訪問初始化

let drive = Drive<Car>() 

class Car : Steering { 
    init() { } 
    func turnWheel() { } 
} 

protocol Steering { 
    func turnWheel() 
} 

class Drive<T:Steering> {  
    func Go() { 
     var vehicle = T() 
     vehicle.turnWheel() 
    } 
} 

回答

6

因爲T約束到Steering。您的約束說,「T可以是任何類型的符合Steering協議。然而,如果我有這個類:

class Airplane : Steering { 
    init(altitude : Int) { 
    } 

    func turnWheel() { 
    } 
} 

突然之間我必須符合SteeringT的類型,但不有一個不接受零個參數的初始化

的解決方案是給init添加到您的協議,確保任何符合它具有正確的初始化

protocol Steering { 
    func turnWheel() 
    init() 
} 
+0

謝謝 - 只檢查了另一個答案,因爲它早了兩分鐘,但仍然是upvoted。 – Lee 2014-10-09 19:42:10

+0

@LeeWhitney,實際上,我的時間早了2分鐘(在時間上盤旋以查看時間戳)。無論哪種方式,很高興你的問題得到解決。 – vcsjones 2014-10-09 22:02:05

+0

夠公平,更正。 – Lee 2014-10-10 12:10:28

4

你 - 。因爲編譯器說 - 需要需要一個參數在您的Steering聲明中無任何初始化器。由於只需要T來實現Steering協議,並且您想使用T()來構造它,因此協議Steering需要無參數初始值設定項來保證可以像那樣構造。

protocol Steering { 
    init(); 
    func turnWheel() 
} 

class Car : Steering { 
    required init() { } 
    func turnWheel() { } 
} 
相關問題