面向协议的编程和类Swift

时间:2016-01-13 19:04:28

标签: ios xcode swift2 protocols

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

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保持"黑"即使我打电话给#34; paint"功能将主要颜色设置为"蓝色"和二次色。

我是协议程序设计的新手,所以我将非常感谢您解决此问题。

2 个答案:

答案 0 :(得分:2)

扩展程序无法存储属性,这可能是您在primaryBodyColor的setter中没有任何代码的原因。 primaryBodyColor的实现需要在结构/类中,就像使用seondaryBodyColor一样。因此,如果在本田类中的那一行之前包含以下行,您的代码将按预期工作......

var primaryBodyColor = "black"

答案 1 :(得分:1)

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

默认情况下,Swift中的属性采用getset方法,无需在每个属性之后添加{get set}

如果要添加默认值,可以这样做:

var primaryBodyColor = "Black"

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