01-extension
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
// extention: Double添加計(jì)算屬性
extensionDouble{
//默認(rèn)get以及{}可以省略
varkm:Double{returnself*1_000.0}
varm:Double{returnself}//基本單位:m
varcm:Double{returnself/100.0}
varmm:Double{returnself/1_000.0}
varft:Double{returnself/3.28084}
}
letimDouble:Double=100.85.km
letimMeter:Double=1.85.m
//對(duì)Int結(jié)構(gòu)體添加計(jì)算屬性和自定義方法
extensionInt{
varsquare:Int{returnself*self}
varcube:Int{returnself*self*self}
//自定義方法:重復(fù)執(zhí)行多個(gè)任務(wù)(邏輯)
funcrepetitions(task: () ->Void) {
for_in0..
task()
}
}
}
letimInt =10
funcrepeatFunc() {
print("repeat!!!!")
}
10.repetitions(repeatFunc)
//自定義的類额获,使用擴(kuò)展的方式,添加自定義的方法(method)
structPoint {
varx =0.0
vary =0.0
}
structSize {
varwidth =0.0
varheight =0.0
}
classRectangle {
varorigin =Point()
varsize =Size()
init(origin:Point, size:Size) {
self.origin= origin
self.size= size
}
//.......
}
extensionRectangle{
//添加平移方法
functranslate(x:Double, y:Double) {
self.origin.x+= x
self.origin.y+= y
}
}
letrectangle =Rectangle(origin:Point(), size:Size(width:20, height:100))
rectangle.translate(-5, y:5)
rectangle.origin.x
02-generic
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
funcswapTwoInt(inouta:Int,inoutb:Int) {
(a, b) = (b, a)
}
vara:Int=0
varb:Int=6
swapTwoInt(&a, b: &b)
a
b
funcswapTwoDouble(inouta:Double,inoutb:Double) {
(a, b) = (b, a)
}
//使用泛型函數(shù)優(yōu)化上面問(wèn)題: T: template;
funcswapTwoData(inouta:T,inout_b:T) {
(a, b) = (b, a)
}
varhello ="hello"
varbye ="bye"
swapTwoData(&hello, &bye)
hello
bye
//系統(tǒng)默認(rèn)提供了一個(gè)交換兩個(gè)任意類型的函數(shù)
//swap(&<#T##a: T##T#>, &<#T##b: T##T#>)
//泛型類型
//聲明三個(gè)容器類(數(shù)組/字典/集合)
vararray =Array()
vararrayTwo: [Int] = []
vardictionary =Dictionary()
varset =Set()
//自定義泛型結(jié)構(gòu)體:描述棧Stack
/*棧:后進(jìn)先出
*結(jié)構(gòu)體:屬性(數(shù)組)、方法(入棧/出棧/是否為空)
*
*/
varitems = [Int]()
structStack {
//數(shù)組,存儲(chǔ)棧中的數(shù)據(jù)
varitems = [T]()
//棧是否為空
funcisEmpty() ->Bool{
returnitems.count==0
}
//入棧: items數(shù)組的最后添加數(shù)據(jù)
mutatingfuncpush(item:T) {
items.append(item)
}
//出棧:刪除數(shù)組的最后一項(xiàng)
mutatingfuncpop() ->T? {
//if self.isEmpty() {
//return nil
//} else {
//return items.removeLast()
//}
guard!self.isEmpty()else{
returnnil
}
returnitems.removeLast()
}
}
//對(duì)上面的泛型結(jié)構(gòu)體擴(kuò)展
extensionStack{
//添加只讀計(jì)算屬性,獲取棧中最上面的item(數(shù)組的最后一個(gè))
vartopItem:T? {returnitems.last}
//自定義的方法,返回當(dāng)前棧中數(shù)據(jù)個(gè)數(shù)(數(shù)組的個(gè)數(shù))
funccount() ->Int{
returnitems.count
}
}
//var array = Array()
//實(shí)例化
varstackWithInt =Stack()
stackWithInt.push(1)
stackWithInt.push(2)
stackWithInt.push(3)
stackWithInt.pop()
stackWithInt.topItem
varstackWithString =Stack()
stackWithString.push("Maggie")
stackWithString.push("Bob")
stackWithString.push("Jonny")
stackWithString.topItem
stackWithString.count()
stackWithString.pop()
/**
*課堂練習(xí):創(chuàng)建隊(duì)列結(jié)構(gòu)體(泛型); FIFO:先進(jìn)先出
*屬性(數(shù)組)
*方法(添加數(shù)據(jù)到隊(duì)列;移除隊(duì)列;是否為空)
*/
/* GCD隊(duì)列分類:
*串行隊(duì)列Serial Queue(創(chuàng)建);并行隊(duì)列Concurrent Queue(創(chuàng)建)嫂侍;主隊(duì)列Main Queue(獲取);全局隊(duì)列Global Queue(獲取)
//回到主線程
dispatch_async(dispatch_get_main_queue(), ^{})
*/
structQueue {
//數(shù)組荚坞,存儲(chǔ)隊(duì)列中的數(shù)據(jù)
varitems = [T]()
//隊(duì)列是否為空
funcisEmpty() ->Bool{
returnitems.count==0
}
//添加:items數(shù)組的最后添加數(shù)據(jù)
mutatingfuncaddItemToQueue(item:T) {
items.append(item)
}
//移除:刪除數(shù)組的第一項(xiàng)
mutatingfuncremoveFromQueue() ->T? {
guard!self.isEmpty()else{
returnnil
}
returnitems.removeFirst()
}
//返回隊(duì)列中的數(shù)據(jù)個(gè)數(shù)
funccountInQueue() ->Int{
returnitems.count
}
//使用自定義方法獲取該隊(duì)列中的第一項(xiàng)
funcfirstItemFromQueue() ->T? {
returnitems.first
}
}
//實(shí)例化
varqueueWithString =Queue()
queueWithString.addItemToQueue("Maggie")
queueWithString.addItemToQueue("Bob")
queueWithString.addItemToQueue("Jonny")
queueWithString.removeFromQueue()
queueWithString.countInQueue()
queueWithString.firstItemFromQueue()
//簡(jiǎn)單例子
structPair {
vara:T1
varb:T2
}
vardic =Dictionary()
varpair =Pair(a:0, b:"hello")
pair.a
pair.b
03-class-inher-poly
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
/*封裝Encapsulation
* 1.類的繼承Inheritance/Inherite
* 2.類的多態(tài)Polymorphism
*/
classAvatar {
//兩個(gè)存儲(chǔ)屬性
varname:String
varlife =100
varisAlive:Bool=true
init(name:String) {
self.name= name
}
//計(jì)算屬性:描述當(dāng)前角色的名字
vardescription:String{
get{
return"I'm Avatar\(name)"
}
}
//自定義方法:收到攻擊
funcbeAttacked(attack:Int) {
life-= attack
iflife<=0{
isAlive=false
}
}
}
//玩家
classUser:Avatar{
//新添加兩個(gè)存儲(chǔ)屬性
//分?jǐn)?shù)/級(jí)別
varscore =0
varlevel =0
//重寫(xiě)父類的description計(jì)算屬性(重寫(xiě)get方法)
overridevardescription:String{
get{
return"I'm User\(name)"
}
}
//添加自定義方法
funcgetScore(score:Int) {
self.score+= score
ifself.score>level*100{
self.level+=1
}
}
}
classMagician:User{
//魔法值
varmagic =100
//重寫(xiě)父類的description計(jì)算屬性(重寫(xiě)get方法)
overridevardescription:String{
get{
return"I'm Magician\(name)"
}
}
funcheal(user:User) {
user.life+=10
}
}
//戰(zhàn)士
classWarrior:User{
varweapon:String?
//重寫(xiě)/覆蓋
overridefuncbeAttacked(attack:Int) {
life-= attack /2
iflife<=0{
isAlive=false
}
}
}
classMonster:Avatar{
funcattack(user:User, amount:Int) {
user.beAttacked(amount)
}
}
finalclassZombie:Monster{
vartype ="Default"
}
//多態(tài)性
funcprintBasicInfo(avatar:Avatar) {
print("The avatar's name is\(avatar.name)")
print("The life is\(avatar.life). He is\(avatar.isAlive)?")
}
//實(shí)例對(duì)象
varwarrior=Warrior(name:"Warrior")
varmagician =Magician(name:"Harray Potter")
magician.name
magician.heal(warrior)
warrior.life
warrior.beAttacked(10)
warrior.life
varzombie=Zombie(name:"default Zombie")
zombie.attack(warrior, amount:20)
warrior.life
magician.heal(warrior)
varmonster=Monster(name:"Monster")
printBasicInfo(magician)
printBasicInfo(warrior)
printBasicInfo(zombie)
printBasicInfo(monster)
vararray: [Avatar] = [warrior,magician,zombie,monster]
forvalueinarray{
print("\(value.description)")
}
/*了解:編譯型語(yǔ)言的特性
*編譯期(編譯時(shí)類型) +運(yùn)行期(運(yùn)行時(shí)類型)
*/
/**
* 1.重寫(xiě)/覆蓋(overwrite/override):子類的方法覆蓋父類的方法(要求方法名和參數(shù)名都相同)
* 1.1場(chǎng)景:父類的屬性和方法不足以來(lái)描述子類的特性挑宠,需要用到重寫(xiě)/覆蓋
* 1.2 Swift語(yǔ)言中,重寫(xiě)父類的方法颓影;也可以重寫(xiě)父類的計(jì)算屬性(get/set)
* 2.重載(overload):在同一個(gè)類中的兩個(gè)或者兩個(gè)以上的方法各淀,擁有相同的方法名,但是參數(shù)不相同(個(gè)數(shù)/類型)诡挂。最常見(jiàn)的重載就是類的構(gòu)造函數(shù)(init方法)
*
*/
Day05
新內(nèi)容
類:擴(kuò)展Extension(OC: Category);泛型(Generic)
類:繼承/多態(tài)...
1.extension:擴(kuò)展:
->對(duì)象:系統(tǒng)存在的和自定義 ->類/結(jié)構(gòu)體/枚舉/協(xié)議
->內(nèi)容:添加計(jì)算型屬性; 自定義的方法(也包括構(gòu)造方法)
2.樣例:對(duì)Double結(jié)構(gòu)體添加計(jì)算屬性揪阿;自定義類添加方法(extension)
[ 01-extension ]
NSArray
Generic: 泛型
1. 描述:不指定任何類型的類型; 分為泛型函數(shù)和泛型類型
2. 問(wèn)題:交換兩個(gè)整型/字符串/Float/Double/類型數(shù)據(jù);
-> 方法的邏輯:交換兩個(gè)數(shù)據(jù)疗我;只是類型不同
-> 解決方案:使用泛型函數(shù)
3.樣例:如何使用泛型函數(shù)解決“問(wèn)題”
[ 02-generic ]
/1603/08_Swift/Day05/Day05-AM1.zip
4.樣例:創(chuàng)建泛型類型:描述”棧”結(jié)構(gòu)體
[ 02-generic ]
/1603/08_Swift/Day05/Day05-AM2.zip
5. 課堂練習(xí):仿照”椖衔妫”結(jié)構(gòu)體吴裤,創(chuàng)建“隊(duì)列”結(jié)構(gòu)體
/1603/08_Swift/Day05/Day05-AM3.zip
——————————— 下午內(nèi)容 ———————
6. 類的繼承: OC/Swift語(yǔ)言都是單繼承
7.樣例:創(chuàng)建下面六個(gè)類,繼承關(guān)系如下:
[ 03-class-inher-poly ]
viewController: UIViewController
/1603/08_Swift/Day05/Day05-PM1.zip
#prama mark - UITableViewDataSource
-> Swift:
extension ViewController {
func tableView…..
}
#prama mark - UITableViewDelegate
extension ViewController {
func tableView…..
}
樣例:計(jì)算器樣例(不包含協(xié)議語(yǔ)法)
1. 課堂版本:UIStackView(iOS9新視圖)
2. 案例:使用Swift語(yǔ)法實(shí)現(xiàn)
[ Calculator ]
終結(jié)版本:
Day05知識(shí)點(diǎn):
—> 擴(kuò)展extension相關(guān):
1.描述:對(duì)已存在的和自定義的類/結(jié)構(gòu)體/枚舉添加計(jì)算屬性和方法
2.語(yǔ)法:extension關(guān)鍵詞
—> 泛型Generic相關(guān):
1. 泛型函數(shù)
funcswapTwoData(inouta:T,inout_b:T) {
(a, b) = (b, a) }
2. 泛型類型
structQueue {}
—>重寫(xiě)和重載override
1.重寫(xiě)/覆蓋(overwrite/override):子類的方法覆蓋父類的方法(要求方法名和參數(shù)名都相同)
1.1場(chǎng)景:父類的屬性和方法不足以來(lái)描述子類的特性溺健,需要用到重寫(xiě)/覆蓋
1.2 Swift語(yǔ)言中麦牺,重寫(xiě)父類的方法;也可以重寫(xiě)父類的計(jì)算屬性(get/set)
2.重載(overload):在同一個(gè)類中的兩個(gè)或者兩個(gè)以上的方法鞭缭,擁有相同的方法名剖膳,但是參數(shù)不相同(個(gè)數(shù)/類型)。最常見(jiàn)的重載就是類的構(gòu)造函數(shù)(init方法)