2016-01-13 83 views
2

我试图从流行的教程网站上实现面向协议的类看教程。到目前为止,我得到了一切正确的信息,但由于某种原因,其中一个属性在其他更新时未更新。 下面是代码:面向协议的编程和类Swift

protocol Paintable : class { 
    var primaryBodyColor : String{get set} 
    var secondaryBodyColor : [String]? {get set} 

    func paint(newPrimaryColor : String, newSecondaryColor : [String]?) 
} 


extension Paintable { 
    var primaryBodyColor : String { 
     get { 
      return "Black" 
     } 
     set { 
     } 
    } 
} 

protocol Wheeled { 
    var numberOfWheels : Int {get set} 
} 


extension Wheeled { 
    var numberOfWheels : Int { 
     get { 
      return 4 
     } 

     set { 
     } 
    } 
} 
protocol EngineSize { 
    var engineSizeCC : Int {get set} 
} 

extension EngineSize { 
    var engineSizeCC : Int { 
     return 2300 
    } 
} 




class Honda : Transport, Paintable, Wheeled, EngineSize { 
    var secondaryBodyColor : [String]? 
    var engineSizeCC : Int 
    //We can also override default initializer of protocol, here we are going to instantiate with our initializer 
    init(engineSizeCC : Int){ 
     self.engineSizeCC = engineSizeCC 
    } 

    func paint(newPrimaryColor: String, newSecondaryColor: [String]?) { 
     primaryBodyColor = newPrimaryColor 
     secondaryBodyColor = newSecondaryColor 
    } 
} 

var civic = Honda(engineSizeCC: 400) 
civic.primaryBodyColor 
civic.passengerCapacity 
civic.numberOfWheels 
civic.engineSizeCC 

civic.paint("blue", newSecondaryColor: ["Red","Purple"]) 
civic.primaryBodyColor -> "Black" 
civic.secondaryColor -> ["Red"], ["Purple"] 

我遇到的问题是primaryBodyColor保持“黑”即使我被称为“油漆”功能设置主色为“蓝”和辅色。

我是新的协议oreinted编程,所以我会感谢帮助解决这个问题。

+1

你需要在'Honda'实现'primaryBodyColor'因为'Paintable'默认的实现是不正确的。 – Sulthan

+0

@Sulthan我不关注。 paint方法在secondaryBodyColors中工作,但不在primaryBodyColor中。我将不胜感激,如果你告诉我如何解决* paint方法中的问题* – Rosh

回答

2

扩展无法存储属性,这也许就是为什么您在设置器primaryBodyColor中没有任何代码。 primaryBodyColor的实现需要在struct/class中,就像您使用seondaryBodyColor所做的一样。所以,如果你包括以下行本田班内前行,你的代码将继续按照预期...

var primaryBodyColor = "black" 
+0

谢谢。我想了一会儿,是的,这就是我最终做的。 – Rosh

1

就像在评论中说过的那样,primaryBodyColor的实现总是返回黑色,并且不允许设置。

默认情况下,Swift中的属性有一个getset方法,在每个方法之后不需要添加{get set}

如果你想添加一个默认值,你可以做这样的:

var primaryBodyColor = "Black" 

你甚至不需要将其声明为字符串,因为编译器会认识到,"Black"是一个字符串和类型它正确。

+0

是否可以使用* paint *函数更改默认值而不是初始化它。 – Rosh

+0

我也认为Protocol中的属性必须有明确的getter和setter。 – Rosh

+0

我不知道,我会调查更多。 – EmilioPelaez