【问题标题】:Protocol Oriented Programming and Class Swift面向协议的编程和类 Swift
【发布时间】:2016-01-13 19:04:27
【问题描述】:

我正在尝试从流行的教程网站上实现面向协议的课程观看教程。到目前为止,我的一切都是正确的,但由于某种原因,其中一个属性没有更新,而其他属性则更新了。 这是代码:

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”函数将主色设置为“蓝色”和辅助色。

我是面向协议编程的新手,因此我将感谢您在解决此问题方面的帮助。

【问题讨论】:

  • 你需要在Honda中实现primaryBodyColor,因为Paintable中的默认实现是不正确的。
  • @Sulthan 我不关注。 paint 方法在secondaryBodyColors 中有效,但在primaryBodyColor 中无效。如果您告诉我如何解决 paint 方法 中的问题,我将不胜感激

标签: ios xcode swift2 protocols


【解决方案1】:

Extensions 不能存储属性,这也许就是为什么你在primaryBodyColor 的setter 中没有任何代码的原因。 primaryBodyColor 的实现需要在一个结构/类中,就像你对seondaryBodyColor 所做的那样。因此,如果在 Honda 类中的该行之前包含以下行,您的代码将按预期工作......

var primaryBodyColor = "black"

【讨论】:

  • 谢谢。我后来发现了,是的,这就是我最终做的事情。
【解决方案2】:

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

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

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

var primaryBodyColor = "Black"

您甚至不需要将其声明为 String,因为编译器会意识到 "Black" 是一个字符串并正确键入它。

【讨论】:

  • 是否可以使用 paint 函数而不是初始化它来更改默认值。
  • 我也认为Protocol中的属性必须有明确的getter和setter。
  • 我不知道,我会调查更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多