源代码:
//第十七章:协议 第十八章:泛型 第十九章:swift内存管理
//Create By ChenZhen
//协议实例方法
//protocol Figure {
// func onDraw()
//}
//
//class Rectangle: Figure {
// func onDraw() {
// print("绘制矩形...")
// }
//}
//
//class Circle: Figure {
// func onDraw() {
// print("绘制圆形...")
// }
//}
//
//let rect: Figure = Rectangle()
//rect.onDraw()
//
//let circle: Figure = Circle()
//circle.onDraw()
//协议静态方法
//protocol Account {
// static func interestBy(amount: Double) -> Double
//}
//
//class ClassImp: Account {
// class func interestBy(amount: Double) -> Double {
// return 0.0668 * amount
// }
//}
//
//struct StructImp: Account {
// static func interestBy(amount: Double) -> Double {
// return 0.0668 * amount
// }
//}
//
//enum EnumImp: Account {
// static func interestBy(amount: Double) -> Double {
// return 0.0668 * amount
// }
//}
//协议变异方法
//protocol Editable {
// mutating func edit()
//}
//
//class ClassImp: Editable {
// var name = "ClassImp"
// func edit() {
// print("编辑ClassImp...")
// self.name = "编辑ClassImp"
// }
//}
//
//struct StructImp: Editable {
// var name = "StructImp"
// mutating func edit() {
// print("编辑StructImp...")
// self.name = "编辑StructImp..."
// }
//}
//
//enum EnumImp: Editable {
// case Monday
// case Tuesday
// case Wednesday
// case Thursday
// case Friday
//
// mutating func edit() {
// print("编辑EnumImp...")
// self = .Friday
// }
//}
//
//var classInstance: Editable = ClassImp()
//classInstance.edit()
//
//var StructInstance: Editable = StructImp()
//StructInstance.edit()
//
//var enumInstance: Editable = EnumImp.Monday
//enumInstance.edit()
//print("\(enumInstance)")
//协议实例属性
//protocol Person {
// var firstName: String { get set }
// var lastName: String { get set }
// var fullName: String { get set }
//}
//
//class Employee: Person {
// var no: Int = 0
// var job: String?
// var salary: Double = 0
//
// var firstName: String = "chen"
// var lastName: String = "zhen"
//
// var fullName: String {
// get {
// return self.firstName + self.lastName
// }
// set {
// var name = newValue.components(separatedBy: ".")
// self.firstName = name[0]
// self.lastName = name[1]
// }
// }
//}
//
//var per1: Person = Employee()
//per1.fullName = "ya.tou"
//print(per1.fullName)
//协议的合成
//定义轮船协议
//protocol Ship {
// var displacement: Double { get set }
//}
定义武器协议
//protocol Weapon {
// var gunNumber: Int { get set }
//}
//
//class WarShip: Ship, Weapon {
// var displacement = 10_000_000.00
// var gunNumber = 10
//}
//
//func showWarResource(resource: Ship & Weapon) {
// print("Ship \(resource.displacement) - Weapon \(resource.gunNumber)")
//}
//
//let ship = WarShip()
//showWarResource(resource: ship)
//扩展遵从协议
//protocol Editable {
// mutating func edit()
//}
//
//struct Account {
// var amount: Double = 10.0
// var owner: String = ""
//}
//
//extension Account: Editable {
// mutating func edit() {
// self.amount *= 100
// self.owner = "chenzhen"
// }
//}
//
//var account = Account()
//account.edit()
//print("\(account.owner) - \(account.amount)")
//使用泛型函数
//func isEquals<T: Comparable>(a: T, b: T) -> Bool{
// return (a == b)
//}
//
//let n1 = 200
//let n2 = 200
//print(isEquals(a: n1, b: n2))
//
//let s1 = "ac"
//let s2 = "alll"
//print(isEquals(a: s1, b: s2))
//String类型的结构体队列
//struct Queue<T> {
// var items = [T]()
//
// mutating func queue(item: T) {
// items.append(item)
// }
//
// mutating func dequeue() -> T? {
// if items.isEmpty {
// return nil
// } else {
// return items.remove(at: 0)
// }
// }
//}
//
//var strQueue = Queue<Any>()
//strQueue.queue(item: 1)
//strQueue.queue(item: 2)
//strQueue.queue(item: 3)
//strQueue.queue(item: 4)
//
//print(strQueue.dequeue()!)
//print(strQueue.dequeue()!)
//print(strQueue.dequeue()!)
//print(strQueue.dequeue()!)
//swift自动引用计数
//class Employee {
// var no: Int
// var name: String
// var job: String
// var salary: Double
//
// init(no: Int, name: String, job: String, salary: Double) {
// self.no = no
// self.name = name
// self.job = job
// self.salary = salary
// print("构造成功")
// }
//
// deinit {
// print("析构成功")
// }
//}
//
//var ref1: Employee?
//var ref2: Employee?
//var ref3: Employee?
//
//ref1 = Employee(no: 1, name: "cz", job: "CEO", salary: 190000.0)
//ref2 = ref1
//ref3 = ref1
//
//
//ref1 = nil
//ref2 = nil
//ref3 = nil
//强引用循环
//class Employee {
// var no: Int
// var name: String
// var job: String
// var salary: Double
// var dept: Department?
//
// init(no: Int, name: String, job: String, salary: Double) {
// self.no = no
// self.name = name
// self.job = job
// self.salary = salary
// print("员工\(name)已经构造成功")
// }
// deinit {
// print("员工\(name)已经析构成功")
// }
//}
//
//class Department {
// var no: Int = 0
// var name: String = ""
// var manager: Employee?
//
// init(no: Int, name: String) {
// self.no = no
// self.name = name
// print("部门\(name)已经构造成功")
// }
// deinit {
// print("部门\(name)已经析构成功")
// }
//}
//
//var emp: Employee?
//var dept: Department?
//
//emp = Employee(no: 7698, name: "chenzhen", job: "Salesman", salary: 12000.0)
//dept = Department(no: 30, name: "Sales")
//
//emp!.dept = dept
//dept!.manager = emp
//
//emp = nil
//dept = nil
//弱引用
//class Employee {
// var no: Int
// var name: String
// var job: String
// var salary: Double
// weak var dept: Department?
//
// init(no: Int, name: String, job: String, salary: Double) {
// self.no = no
// self.name = name
// self.job = job
// self.salary = salary
// print("员工\(name)已经构造成功")
// }
// deinit {
// print("员工\(name)已经析构成功")
// }
//}
//
//class Department {
// var no: Int = 0
// var name: String = ""
// var manager: Employee?
//
// init(no: Int, name: String) {
// self.no = no
// self.name = name
// print("部门\(name)已经构造成功")
// }
// deinit {
// print("部门\(name)已经析构成功")
// }
//}
//
//var emp: Employee?
//var dept: Department?
//
//emp = Employee(no: 7698, name: "chenzhen", job: "Salesman", salary: 12000.0)
//dept = Department(no: 30, name: "Sales")
//
//emp!.dept = dept
//dept!.manager = emp
//
//emp = nil
//dept = nil
//无主引用
//class Employee {
// var no: Int
// var name: String
// var job: String
// var salary: Double
// weak var dept: Department?
//
// init(no: Int, name: String, job: String, salary: Double) {
// self.no = no
// self.name = name
// self.job = job
// self.salary = salary
// print("员工\(name)已经构造成功")
// }
// deinit {
// print("员工\(name)已经析构成功")
// }
//}
//
//class Department {
// var no: Int = 0
// var name: String = ""
// unowned var manager: Employee
//
// init(no: Int, name: String, manager: Employee) {
// self.no = no
// self.name = name
// self.manager = manager
// print("部门\(name)已经构造成功")
// }
// deinit {
// print("部门\(name)已经析构成功")
// }
//}
//
//var emp: Employee?
//var dept: Department?
//
//emp = Employee(no: 7698, name: "chenzhen", job: "Salesman", salary: 12000.0)
//dept = Department(no: 30, name: "Sales", manager: emp!)
//
//emp!.dept = dept
dept!.manager = emp
//
//emp = nil
//dept = nil
//闭包中的强引用循环示例
//class Employee {
// var no: Int = 0
// var firstName: String
// var lastName: String
// var job: String
// var salary: Double
//
// init(no: Int, firstName: String, lastName: String, job: String, salary: Double) {
// self.no = no
// self.firstName = firstName
// self.lastName = lastName
// self.job = job
// self.salary = salary
// print("员工\(firstName)已经构造成功")
// }
// deinit {
// print("员工\(firstName)已经析构成功")
// }
//
// lazy var fullName: () -> String = {
// return self.firstName + "." + self.lastName
// }
//}
//
//var emp: Employee? = Employee(no: 7698, firstName: "chen", lastName: "zhen", job: "Salesman", salary: 1600)
//print(emp!.fullName())
//emp = nil
//解决闭包强引用循环
class Employee {
var no: Int = 0
var firstName: String
var lastName: String
var job: String
var salary: Double
init(no: Int, firstName: String, lastName: String, job: String, salary: Double) {
self.no = no
self.firstName = firstName
self.lastName = lastName
self.job = job
self.salary = salary
print("员工\(firstName)已经构造成功")
}
deinit {
print("员工\(firstName)已经析构成功")
}
lazy var fullName: () -> String = {
[unowned self] () -> String in
let fn = self.firstName
let ln = self.lastName
return fn + "." + ln
}
}
var emp: Employee? = Employee(no: 7698, firstName: "chen", lastName: "zhen", job: "Salesman", salary: 1600)
print(emp!.fullName())
emp = nil