[英]Protocol Oriented Programming and Class 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 保持“黑色”,即使我调用“paint”函数将原色设置为“蓝色”和辅助色。
我是协议导向编程的新手,所以我将感谢解决此问题的帮助。
扩展不能存储属性,这也许就是为什么在primaryBodyColor
的 setter 中没有任何代码的primaryBodyColor
。 primaryBodyColor
的实现需要在结构/类中,就像您对seondaryBodyColor
所做的seondaryBodyColor
。 因此,如果就在 Honda 类中的该行之前包含以下行,则您的代码将按预期工作......
var primaryBodyColor = "black"
就像评论中所说的那样,您对primaryBodyColor
的实现总是返回黑色并且不允许设置。
默认情况下,Swift 中的属性有一个get
和set
方法,无需在每个{get set}
后添加{get set}
。
如果要添加默认值,可以这样做:
var primaryBodyColor = "Black"
您甚至不需要将其声明为 String,因为编译器会意识到"Black"
是一个字符串并正确键入它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.