protocol AirSystem {
func airMethod() -> String
}
class Window :AirSystem {
var windowNum:Int
init(windowNum :Int) {
self.windowNum = windowNum
}
func airMethod() -> String {
return "通过窗子进行空气调节"
}
}
class AirCondition:AirSystem {
var workRate : Double
init(workRate:Double) {
self.workRate = workRate
}
func airMethod() -> String {
return "通过空调进行空气调节"
}
}
enum BuildStyle {
case Normal
case Classical
case HiTeach
}
class Building {
var buildStyle: BuildStyle
var layerNum : Int
init(buildStyle:BuildStyle,layerNum:Int) {
self.buildStyle = buildStyle
self.layerNum = layerNum
}
func description() {
if self.buildStyle==BuildStyle.Normal {
print("这是具有\(layerNum)层的正常风格的建筑")
}
if self.buildStyle==BuildStyle.Classical {
print("这是具有\(layerNum)层的古典风格的建筑")
}
if self.buildStyle==BuildStyle.HiTeach {
print("这是具有\(layerNum)层的科技风格的建筑")
}
}
}
class ChineseBuilding: Building {
var airSystem:AirSystem
var name:String? = nil
init( airSystem:AirSystem, name :String?,buildStyle:BuildStyle,layerNum:Int) {
self.airSystem = airSystem
self.name = name
super.init(buildStyle: buildStyle, layerNum: layerNum)
}
var height : Double{
return 3.5*Double(layerNum)
}
override func description() {
if (self.name != nil) {
print("中式风格的建筑\(name!),高度\(height)米,空气调节方式是:\(airSystem.airMethod())")
}else{
print("这是中式风格建筑,高度\(height)米,空气调节方式是:\(airSystem.airMethod())")
}
}
}
class ModleBuilding: Building {
var airSystem:AirSystem
var height :Double{
return 3.0*Double(layerNum)
}
init(airSystem:AirSystem,buildStyle:BuildStyle, layerNum:Int) {
self.airSystem = airSystem
super.init(buildStyle: buildStyle, layerNum: layerNum)
}
convenience init(isSkyscraper:Bool,airSystem:AirSystem){
if isSkyscraper {
self.init(airSystem: airSystem, buildStyle: BuildStyle.HiTeach, layerNum: 100)
}else{
self.init(airSystem: airSystem, buildStyle: BuildStyle.HiTeach, layerNum: 10)
}
}
func rebuild(rebuildmethod:(Int)-> Int) {
self.layerNum = rebuildmethod(layerNum)
}
}
var window = Window(windowNum: 100)
var AirConditioner = AirCondition(workRate: 98)
typealias CB = ChineseBuilding
typealias MB = ModleBuilding
var dicCBs = [String:CB]()
for i in 0...9{
dicCBs.updateValue(CB(airSystem: window, name: "中式建筑\(i)", buildStyle: BuildStyle.Classical, layerNum: 3), forKey:"中式建筑\(i)" )
}
for i in dicCBs{
i.value.description()
}
var mb1 = MB(airSystem: AirConditioner, buildStyle: BuildStyle.HiTeach, layerNum: 30)
var mb2 = MB(isSkyscraper: true, airSystem: AirCondition(workRate: 2000))
print("重建前的建筑高度:\(mb1.height)")
mb1.rebuild(rebuildmethod: {(A:Int)->Int in return A+10})
print("重建后的建筑高度:\(mb1.height)")