创建项目要求:
- 创建macOS的Command Line Tool项目。
- Product Name:填写学生学号+学生姓名
- Organization Name:填写学生姓名
- Organization Identifier:填写学生学号
考试内容与要求
- 定义动力类型(PowerType)枚举,具体要求:
枚举名:PowerType
枚举值:
Electric:表示电力动力
Petrolic:表示燃油动力
Hybrid:表示混合动力 - 定义人的性别(Gender)枚举,具体要求:
枚举名:Gender
枚举值:
Male:表示男性性别
Female:表示女性性别 - 定义车主(Owner)结构体,具体要求:
结构体名:Owner
简介:记录车主个人信息
存储属性:
name:字符串类型,表示业主姓名
gender:Gender枚举类型,表示业主性别
age:整型,表示业主年龄
TEL:字符串类型,表示业主电话号码 - 定义交通工具工作系统(WorkSystem)协议,具体要求:
协议名称:WorkSystem
简介:表示交通工具工作系统
协议属性powerType:
属性名:powerType
类型:PowerType枚举,只读get类型
简介:交通工具的动力系统类型
协议方法moveMethod:
方法名:moveMethod
简介:描述交通工具的移动方式
参数1:moveDescription,类型为闭包(PowerType)->String
返回值:无 - 定义交通工具(Vehicle)类,具体要求:
类名:Vehicle
简介:通用的交通工具类型
继承父类:无
实现协议:无
存储属性:
maxSpeed:整型变量,表示交通工具最高运行速度
passengerNum:整型变量,表示交通工具载客人数
指定初始化器:
形参:考生决定形参类型和顺序。
功能:为存储属性赋值
便利初始化器:
无
成员方法describe:
方法名:describe
简介:对交通工具的简单描述
形参:无
返回值:String
功能:返回描述交通工具对象的字符串,考生决定字符串内容。 - 定义高铁(CRH)类,具体要求:
类名:CRH
简介:高速铁路交通工具
继承父类:Vehicle
实现协议:WorkSystem
存储属性:
weight:整型变量,表示高铁的总备重
实现协议属性
计算属性:
无
指定初始化器:
形参:考生决定形参类型和顺序
功能:对子类存储属性和父类存储属性赋值
便利初始化器:
形参:isCRH380,布尔类型
功能:1)如果isCRH380实参为真,构造最高速度为380的高铁对象;2)否则,构造最高速度低于380的高铁对象
重写父类方法describe:
功能:返回描述高铁CRH对象的字符串。考生决定字符串内容,必须包括最高速度和乘客数信息。
实现协议方法moveMethod
功能:打印出moveDescription闭包返回的字符串,闭包传参为powerType对象。 - 定义汽车(Automobile)类,具体要求:
类名:Automobile
简介:汽车交通工具
继承父类:Vehicle
实现协议:WorkSystem
存储属性:
weight:整型变量,表示汽车的总备重
owner:元组类型,表示车主,元组包括车主姓名和电话号,类型均为字符串
实现协议属性
计算属性:
averageSpeed:表示汽车的平均速度。双精度类型。get set类型计算属性。计算方法:平均速度averageSpeed为最高速度maxSpeed的1/2
指定初始化器:
形参:考生决定形参类型和顺序
功能:对子类存储属性和父类存储属性赋值
便利初始化器:
无
重写父类方法describe:
功能:返回描述汽车对象的字符串。考生决定字符串内容,必须包括最高速度、乘客数和车主信息。
实现协议方法moveMethod
功能:打印出moveDescription闭包返回的字符串 - 执行以下逻辑功能:
- 使用指定构造器构造高铁CRH对象,打印出describe方法返回值
- 使用便利构造器构造高铁CRH380对象,打印出describe方法返回值
- 构造3个车主Owner对象。将3个Owner对象存入字典,字典key为车主姓名,value为车主Owner对象
- 遍历存储车主Owner的字典,为每位车主owner构造汽车Automobile对象,并将这3个汽车Automobile对象保存在数组中
- 使用for循环遍历保存Automobile对象的数组。在每次循环中,1)打印汽车Automobile对象的describe方法返回值;2)调用汽车Automobile对象的moveMethod方法,闭包中描述汽车的动力类型
参考输出
CRH高速铁路最高速度300,可乘坐1000乘客
CRH高速铁路最高速度380,可乘坐1000乘客
汽车最高速度120,可乘坐5名乘客,车主是:张三(13888888888)
该车动力类型是:Hybrid
汽车最高速度120,可乘坐5名乘客,车主是:李四(13999999999)
该车动力类型是:Hybrid
汽车最高速度120,可乘坐5名乘客,车主是:王五(13555555555)
该车动力类型是:Hybrid
评分与量化标准
- 综合:程序无语法错误,能正常运行,输出符合预期(5分)
- 考点:类定义、类继承、属性和方法、协议、枚举、闭包、数组字典(10分)
- 考点:结构体、可选、下标、扩展、元组、变量别名、便利构造器(4分)
- 其他:代码风格良好,在代码中写清楚注释,注明题目要求(1分)
- 扣分项:程序无法运行、代码可读性差无法理解(-10分)
参考代码
import Foundation
enum PowerType{
case Electric//表示电力动力
case Petrolic//表示燃油动力
case Hybrid//表示混合动力
}
enum Gender{
case Male//表示男性性别
case Female//表示女性性别
}
struct Owner {
var name:String//字符串类型,表示业主姓名
var genderGender:Gender//枚举类型,表示业主性别
var age:Int//整型,表示业主年龄
var TEL:String//字符串类型,表示业主电话号码
}
protocol WorkSystem{
var powerType : PowerType {get}
mutating func moveMethod(moveDescription:(PowerType)->String)
}
class Vehicle {
var maxSpeed:Int //整型变量,表示交通工具最高运行速度
var passengerNum:Int //整型变量,表示交通工具载客人数
init(maxSpeed:Int,passengerNum:Int) {
self.maxSpeed=maxSpeed
self.passengerNum=passengerNum
}
convenience init(a:Bool){
if(true)
{
self.init(maxSpeed: 1, passengerNum: 1)
}else
{
self.init(maxSpeed: 0, passengerNum: 0)
}
}
func describe() ->String {
return "这是Vehicle"
}
}
class CRH: Vehicle,WorkSystem {
var weight:Int //整型变量,表示高铁的总备重
var powerType: PowerType = PowerType.Electric
func moveMethod(moveDescription: (PowerType) -> String) {
print("该车动力类型是:\(moveDescription(self.powerType))")
}
required init(maxSpeed: Int, passengerNum: Int,weight:Int,powerType: PowerType ) {
self.weight=weight
self.powerType=powerType
super.init(maxSpeed: maxSpeed, passengerNum: passengerNum)
}
convenience init(isCRH380:Bool) {
if(true)
{
self.init(maxSpeed: 380, passengerNum: 1000, weight: 100, powerType: PowerType.Electric)
}
else
{
self.init(maxSpeed: 100, passengerNum: 99, weight: 99, powerType: PowerType.Electric)
}
}
override func describe() ->String {
return "CRH高速铁路最高速度\(self.maxSpeed),可乘坐\(self.passengerNum)乘客"
}
}
class Automobile: Vehicle,WorkSystem {
var weight:Int //整型变量,表示汽车的总备重
var owner:(String,String) //元组类型,表示车主,元组包括车主姓名和电话号,类型均为字符串
var powerType: PowerType = PowerType.Hybrid
var averageSpeed :Double{//表示汽车的平均速度。双精度类型
get
{
return 0.5 * Double(maxSpeed)
}
}
func moveMethod(moveDescription: (PowerType) -> String) {
print("该车动力类型是:\(moveDescription(self.powerType))")
}
required init(maxSpeed: Int, passengerNum: Int,weight:Int ,owner:(String,String),powerType: PowerType)
{
self.weight=weight
self.owner=owner
self.powerType=powerType
super.init(maxSpeed: maxSpeed, passengerNum: passengerNum)
}
override func describe() ->String {
return "汽车最高速度\(self.maxSpeed),可乘坐\(self.passengerNum)名乘客,车主是:\(self.owner.0)(\(self.owner.1))"
}
}
//使用指定构造器构造高铁CRH对象,打印出describe方法返回值
var c1=CRH(maxSpeed: 300, passengerNum: 1000,weight:1000,powerType: PowerType.Electric)
print(c1.describe())
//使用便利构造器构造高铁CRH380对象,打印出describe方法返回值
var c2=CRH(isCRH380:true)
print(c2.describe())
//构造3个车主Owner对象。将3个Owner对象存入字典,字典key为车主姓名,value为车主Owner对象
var o1=("王五","13555555555")
var o2=("张三","13888888888")
var o3=("李四","13999999999")
var a1 = Automobile(maxSpeed: 120, passengerNum: 5,weight:10 ,owner:("王五","13555555555"),powerType: PowerType.Hybrid)
var a2 = Automobile(maxSpeed: 120, passengerNum: 5,weight:10 ,owner:("张三","13888888888"),powerType: PowerType.Hybrid)
var a3 = Automobile(maxSpeed: 120, passengerNum: 5,weight:10 ,owner:("李四","13999999999"),powerType: PowerType.Hybrid)
var dic = ["王五":o1, "张三":o2, "李四":o3]
//遍历存储车主Owner的字典,为每位车主owner构造汽车Automobile对象,并将这3个汽车Automobile对象保存在数组中
var array = [ Automobile]()
for (_,o) in dic
{
var a = Automobile(maxSpeed: 120, passengerNum: 5,weight:10 ,owner:o,powerType: PowerType.Hybrid)
array.append(a)
}
//使用for循环遍历保存Automobile对象的数组。在每次循环中,1)打印汽车Automobile对象的describe方法返回值;2)调用汽车Automobile对象的moveMethod方法,闭包中描述汽车的动力类型
for a in array
{
print(a.describe())
a.moveMethod {(PowerType) -> String in
return "\(PowerType)"
}
}