编辑代码

// //枚举的定义
// enum MonthFull {
//     case January
//     case February
//     case March
//     case April
//     case May
//     case June
//     case July
//     case August
//     case September
//     case October
//     case November
//     case December
// }
// //枚举的定义
// enum Month {
//     case January,February,March,April,May,June,July,August,September,October,November,December
// }
// //枚举赋值
// var thisMonth = Month.August
// var nextMonth : Month = .September//类型声明后,赋值过程中可以省略枚举类型名
// //读取枚举值
// switch nextMonth {
// case .January, .February, .March, .April, .May, .June : print("It belongs first half year")
// default : print("It belongs second half year")
// }
// //定义原始值
// enum Car:Int{
//     case truck = 0
//     case sportsCar
//     case SUV
//     case MPV
//     case limo
// }
// //访问原始值
// var myCar=Car.SUV
// var rawValue=myCar.rawValue
// myCar=Car.limo
// rawValue=myCar.rawValue

// let yourCar = Car(rawValue:1)
// //关联值
// enum transportFee {
//     case byAir(Int,Int,Int)
//     case byCar(Int,Int)
//     case byTrain(Int)
// }
// //关联值的赋值
// var fromShanghaiToBeijing = transportFee.byTrain(299)
// fromShanghaiToBeijing = .byAir(800, 230, 50)
// //访问关联值
// switch fromShanghaiToBeijing {
// case .byAir(let ticketFee, let tax, let insurance) : print("The sum fee is \(ticketFee + tax + insurance) by air")
// case .byCar(let fuelFee, let highwayFee) : print("The sum fee is \(fuelFee + highwayFee) by car")
// case .byTrain(let ticketFee) : print("The sum fee is \(ticketFee) by Train")
// }
// //可选型的实现
// var hobby: String?
// hobby = "Basketball"
// hobby = nil

// switch hobby {
// case .none:
//     print("No hobby")
// case .some(let hobbyName):
//     print("Hobby is \(hobbyName)")
// }



// //2.协议
// //协议的声明
// protocol Person {
//     var name: String { get set}
//     var age: Int { get }
// }
// //类遵守协议
// class Student:Person{
//     var name:String
//     var age:Int
//     init(){
//         name=""
//         age=0
//     }
// }

// //协议中的关联类型
// protocol Person{
//     associatedtype UnknownType
//     var name:String{get set}
//     var age:Int{get}
//     var weight:UnknownType{get}
// }
// class Student:Person{
//     var name:String
//     var age:Int
//     var weight:Double
//     init(){
//         name = ""
//         age = 0
//         weight = 0.0
//     }
// }



// //协议的继承性
// protocol Person {
//     associatedtype UnknownType
//     var name : String {get set}
//     var age : Int {get set}
//     var weight: UnknownType { get }
//     func personDescription()
// }
// protocol Student {
//     var school : String {get set}
//     func studentDescription()
// }
// protocol Graduate : Person, Student {
//     var supervisor : String {get set}
//     func graduateDescription()
// }
// class ComputerAssociationMember : Graduate {
//     var name : String = ""
//     var age : Int
//     var weight: Double
//     var school : String
//     var supervisor : String
//     func personDescription() {
//         print("It's person description")
//     }
//     func studentDescription() {
//         print("It's student description")
//     }
//     func graduateDescription() {
//         print("It's graduate description")
//     }
//     init(name : String, age : Int, weight: Double, school : String, supervisor :String){
//         self.name = name
//         self.age = age
//         self.weight = weight
//         self.school = school
//         self.supervisor = supervisor
//     }
// }
// let theMember = ComputerAssociationMember(name: "Tom", age: 23, weight: 69.2, school: "BUAA", supervisor: "Ian")
// theMember.personDescription()
// theMember.studentDescription()
// theMember.graduateDescription()

// //3拓展
// //扩展计算属性
// extension Int {
//     var kg  : Int {return self * 1000 }
//     var ton : Int {return self * 1000000}
// }
// var aChick = 2.kg
// var aElephant = 8.ton
// print("aClick is \(aChick)g")
// print("aElephant is \(aElephant)g")

// var aChick = 2.kg
// var aElephant = 8.ton
// print("aClick is \(aChick)g")
// print("aElephant is \(aElephant)g") //扩展计算属性
// extension Int {
//     var kg  : Int {return self * 1000 }
//     var ton : Int {return self * 1000000}
// }


// //扩展构造器
// struct Student {
//     var name : String
//     var id : String
//     var age : Int
//     init(){
//         name = ""
//         id = ""
//         age = 0
//     }
// }
// extension Student {
//     init(name : String, id : String, age : Int){
//         self.name = name
//         self.id = id
//         self.age = age
//     }
// }
// let theStudent = Student(name: "Jack", id: "37060115", age: 18)
// print("\(theStudent)")

// //扩展方法
// struct Student {
//     var name : String
//     var id : String
//     var age : Int
//     init(){
//         name = ""
//         id = ""
//         age = 0
//     }
// }
// extension Student {
//     init(name : String, id : String, age : Int){
//         self.name = name
//         self.id = id
//         self.age = age
//     }
//     func description(){
//         print("\(name)'s age is \(age) and id is \(id)")
//     }
// }
// let theStudent = Student(name: "Jack", id: "37060115", age: 18)
// theStudent.description()

// //扩展下标
// struct Student {
//     var name : String
//     var id : String
//     var age : Int
//     init(){
//         name = ""
//         id = ""
//         age = 0
//     }
// }
// extension Student {
//     init(name : String, id : String, age : Int){
//         self.name = name
//         self.id = id
//         self.age = age
//     }
// }
// struct Class {
//     var students = [Student]()
// }
// extension Class {
//     subscript(Index : Int) -> String{
//         return students[Index].name
//     }
// }
// var theClass = Class()
// theClass.students.append(Student(name: "Sam", id: "0", age: 16))
// theClass.students.append(Student(name: "Tom", id: "1", age: 18))
// theClass.students.append(Student(name: "Jeff", id: "2", age: 19))
// let oneStudentName = theClass[0]
// print(oneStudentName)


// //练习
// class Founder {
//     var surname: String
//     var lastname: String
//     init() {
//         surname = ""
//         lastname = ""
//     }
// }
// extension Founder {//扩展计算属性
//     var fullname: String { return lastname + " " + surname }
// }

// let founderOfApple = Founder()
// founderOfApple.surname = "Jobs"
// founderOfApple.lastname = "Steve"
// print(founderOfApple.fullname)
// class Founder {
//     var surname: String
//     var lastname: String
//     init() {
//         surname = ""
//         lastname = ""
//     }
// }
// extension Founder {//扩展构造器
//     var fullname: String { return lastname + " " + surname }
//     convenience init(surname: String, lastname: String) {
//         self.init()
//         self.surname = surname
//         self.lastname = lastname
//     }
// }

// let founderOfApple = Founder(surname: "Jobs", lastname: "Steve")
// print(founderOfApple.fullname)
// class Founder {
//     var surname: String
//     var lastname: String
//     init() {
//         surname = ""
//         lastname = ""
//     }
// }
// extension Founder {
//     var fullname: String { return lastname + " " + surname }
//     convenience init(surname: String, lastname: String) {
//         self.init()
//         self.surname = surname
//         self.lastname = lastname
//     }
//     func description() {//扩展方法
//         print("Founder is \(fullname)")
//     }
// }

// let founderOfApple = Founder(surname: "Jobs", lastname: "Steve")
// founderOfApple.description()
// class Founder {
//     var surname: String
//     var lastname: String
//     init() {
//         surname = ""
//         lastname = ""
//     }
// }
// extension Founder {
//     var fullname: String { return lastname + " " + surname }
//     convenience init(surname: String, lastname: String) {
//         self.init()
//         self.surname = surname
//         self.lastname = lastname
//     }
//     func description() {
//         print("Founder is \(fullname)")
//     }
// }
// struct ManagementTeam {
//     var managers = [Founder]()
// }
// extension ManagementTeam {
//     subscript(Index: Int) -> String {//扩展下标
//         return managers[Index].fullname
//     }
// }
// let founder1 = Founder(surname: "Jobs", lastname: "Steve")
// let founder2 = Founder(surname: "Wotzniak", lastname: "Stephen")
// let founder3 = Founder(surname: "Wayne", lastname: "Ron")
// var appleManagementTeam = ManagementTeam()
// appleManagementTeam.managers.append(founder1)
// appleManagementTeam.managers.append(founder2)
// appleManagementTeam.managers.append(founder3)
// print("Apple Corporation's management team consists of:")
// for manager in appleManagementTeam.managers {
//     print(manager.fullname)
// }


// //练习1-4
// protocol Ownership {
//     var owner: String{ get }
//     var registerDate: String{ get }
//     var serialNo: String{ get }
//     func updateOwnership(newOwner: String, registerDate: String)
// }

// protocol Vehicle {
//     associatedtype WeightType
//     var license: String{ get }
//     var producer: String{ get }
//     var speed: Int{ get }
//     var hour: Int{ get }
//     var distance: Int{ get set }
//     var weight: WeightType { get }
//     func movingVehicle(addedhour: Int)
// }

// class Car : Ownership, Vehicle {
//     var owner: String
//     var registerDate: String
//     var serialNo: String
//     var license: String
//     var producer: String
//     var speed: Int
//     var hour: Int
//     var weight: Double
//     var distance: Int {
//         get {
//             return speed * hour
//         }
//         set {
//             hour = newValue / speed
//         }
//     }
//     func updateOwnership(newOwner: String, registerDate:String) {
//         owner = newOwner
//         self.registerDate = registerDate
//     }
//     func movingVehicle(addedhour: Int) {
//         hour += addedhour
//     }
//     init() {
//         owner = ""
//         registerDate = String()
//         serialNo = ""
//         license = ""
//         producer = ""
//         speed = 0
//         hour = 0
//         weight = 0.0
//     }
//     init(owner: String, registerDate:String, serialNo: String, license: String, producer: String, speed: Int, hour: Int, weight: Double) {
//         self.owner = owner
//         self.registerDate = registerDate
//         self.serialNo = serialNo
//         self.license = license
//         self.producer = producer
//         self.speed = speed
//         self.hour = hour
//         self.weight = weight
//     }
// }

// let myCar = Car(owner: "Tom", registerDate: String(), serialNo: "102008930", license: "BJ0515G", producer: "BMW", speed: 150, hour: 0, weight: 3.5)
// myCar.movingVehicle(addedhour: 800)
// myCar.updateOwnership(newOwner: "Sam", registerDate:"1000")


// //练习5
// protocol Ownership {
//     func updateOwnership(newOwner: String, registerDate: String)
// }
// protocol Vehicle {
//     func movingVehicle(hour: Int)
// }
// class Car {
//     var owner: String
//     var registerDate: String
//     var serialNo: String
//     var license: String
//     var producer: String
//     var speed: Int
//     var hour: Int
//     var weight: Double
//     var distance: Int {
//         get {
//             return speed * hour
//         }
//         set {
//             hour = newValue / speed
//         }
//     }
//     init(owner: String, registerDate: String, serialNo: String, license: String, producer: String, speed: Int, hour: Int, weight: Double) {
//         self.owner = owner
//         self.registerDate = registerDate
//         self.serialNo = serialNo
//         self.license = license
//         self.producer = producer
//         self.speed = speed
//         self.hour = hour
//         self.weight = weight
//     }
// }
// extension Car: Ownership, Vehicle {
//     func updateOwnership(newOwner: String, registerDate: String) {
//         owner = newOwner
//         self.registerDate = registerDate
//     }
//     func movingVehicle(hour: Int) {
//         self.hour += hour
//     }
// }
// let myCar = Car(owner: "Tom", registerDate: String(), serialNo: "102008930", license: "BJ0515G", producer: "BMW", speed: 150, hour: 0, weight: 3.5)
// myCar.movingVehicle(hour: 800)
// myCar.updateOwnership(newOwner: "Sam", registerDate: "10000")



// //练习6-9
// protocol ConsumerGoods{
//     var price: Double { get }
//     var type: String { get }
//     var produceDate: String { get }
//     func consumerGoodsInfo()
// }
// protocol ElectricAppliance{
//     var power: Int { get }
//     var energyConsumptionLevel: Int { get }
//     var use: String { get }
//     func electricApplianceInfo()
// }
// protocol DomesticAppliance: ConsumerGoods, ElectricAppliance {
//     var discount: Double { get }
//     var location: String { get }
//     func domesticApplianceInfo()
// }
// class AirConditioner: DomesticAppliance {
//     var price: Double
//     var type: String
//     var produceDate: String
//     var power: Int
//     var energyConsumptionLevel: Int
//     var use: String
//     var discount: Double
//     var location: String
//     func consumerGoodsInfo() {
//         print("Price:\(price), Type:\(type), Produce Date:\(produceDate)")
//     }
    
//     func electricApplianceInfo() {
//         print("Power:\(power), energy consumption level:\(energyConsumptionLevel), use:\(use)")
//     }
    
//     func domesticApplianceInfo() {
//         print("Discount:\(discount), location:\(location)")
//     }
    
//     init(price: Double, type: String, produceDate: String, power: Int, energyConsumptionLevel: Int, use: String, discount: Double, location: String) {
//         self.price = price
//         self.type = type
//         self.produceDate = produceDate
//         self.power = power
//         self.energyConsumptionLevel = energyConsumptionLevel
//         self.use = use
//         self.discount = discount
//         self.location = location
//     }
// }



// //4.泛型函数
// func swap2Int( a : inout Int, b : inout Int) {
//     let temp = a
//     a = b
//     b = temp
// }
// var a = 3
// var b = 5
// swap(&a, &b)
// print("a is \(a), b is \(b)")

// func swap2String( a : inout String, b : inout String) {
//     let temp = a
//     a = b
//     b = temp
// }
// var c = "Hello"
// var d = "world"
// print("\(c) \(d)")
// swap(&c, &d)
// print("\(c) \(d)")
// print("a is \(a), b is \(b)")
// print("c is \(c), d is \(d)")
// func swap2Element<T>( a : inout T, b : inout T){
//     let temp =  a
//     a =  b
//     b = temp
// }
// swap2Element(a: &a, b: &b)
// swap2Element(a: &c, b: &d)
// print("a is \(a), b is \(b)")
// print("c is \(c), d is \(d)")


// //泛型类
// class Car {
//     var brand: String
//     init(brand: String) {
//         self.brand = brand
//     }
// }

// class Bike {
//     var speed: Int
//     init(speed: Int) {
//         self.speed = speed
//     }
// }

// class Driver<Vehicle> {
//     var name: String
//     var vehicle: Vehicle
//     init(name: String, vehicle: Vehicle) {
//         self.name = name
//         self.vehicle = vehicle
//     }
// }
// let porscheCar = Car(brand: "Porsche")
// let driverTom = Driver(name: "Tom", vehicle: porscheCar)
// let giantBike = Bike(speed: 50)
// let driverSam = Driver(name: "Sam", vehicle: giantBike)