01-class-basic
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
/* 1.如何聲明類绪励、創(chuàng)建對象(不需要繼承)
* 2.類是引用類型(對象賦值;不需要mutating)
* 3.object identity(對象的一致性); === !==
* 4.結(jié)構(gòu)體和類的區(qū)別翰灾?
*/
/*class默認(rèn)編譯器不會(huì)創(chuàng)建構(gòu)造函數(shù)
* 1.默認(rèn)給初始值
* 2.添加構(gòu)造函數(shù)(包含所有的屬性;可選型例外)
*/
classPerson {
//存儲屬性
varfirstName:String//= ""
varlastName:String//= ""
varcareer:String?
//添加構(gòu)造函數(shù)(包含所有)
init(firstName:String, lastName:String, career:String) {
self.firstName= firstName
self.lastName= lastName
self.career= career
}
//添加自定義的方法(修改career)
funcchangeCareer(newCareer:String) {
self.career= newCareer
}
//添加自定義的方法痹筛,返回全名
funcfullName() ->String{
returnfirstName+" "+lastName
}
}
//創(chuàng)建實(shí)例對象Instance
//var firstPerson = Person()
varfirstPerson =Person(firstName:"Steven", lastName:"Jobs", career:"CEO")
firstPerson.fullName()
//引用類型:Swift語言中類的對象的賦值是地址的賦值
varsecondPerson =firstPerson//地址
secondPerson.firstName="Taylor"
secondPerson.lastName="Swift"
secondPerson.career="Singer"
firstPerson.fullName()
secondPerson.fullName()
// object identity(對象的等價(jià)性):兩個(gè)引用類型是否指向同一片內(nèi)存空間蟆豫,如果是签赃,認(rèn)為兩個(gè)對象是等價(jià)的;否則馍佑,不等價(jià)
// Swift語言中毛肋,“==”用來判斷值類型(數(shù)值是否相等),不能用來判斷引用類型
// secondPerson == firstPerson
secondPerson===firstPerson
//創(chuàng)建實(shí)例對象
varthirdPerson =Person(firstName:"Taylor", lastName:"Swift", career:"Singer")
//雖然兩個(gè)實(shí)例對象的值相等,但是并沒有指向同一片內(nèi)存空間
thirdPerson===secondPerson
thirdPerson!==secondPerson
/**結(jié)構(gòu)體和類的選擇問題
1.前者是值類型(copy;耗內(nèi)存)乏矾;后者是引用類型
2.前者內(nèi)存在棧中(效率高);后者內(nèi)存在堆中(相對慢)
3.前者是不能繼承孟抗;后者可以繼承(重用/重寫)
4.前者有默認(rèn)的構(gòu)造函數(shù);后者沒有(手動(dòng)添加)
*/
02-property
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
/* 1.存儲屬性:存儲某個(gè)值(var/let);只可以添加到類和結(jié)構(gòu)體
* 2.計(jì)算型屬性(computed property):不是簡單存儲某個(gè)值钻心,提供get方法和可選的set方法(也可以不實(shí)現(xiàn); readonly:只讀),來間接地(邏輯)獲取和設(shè)置自己的值凄硼,或者設(shè)置其他存儲屬性的值
* 3.類型屬性(type property):針對于某種類型的屬性
-> Int.max Int.min
* 4.特殊:為存儲屬性添加屬性觀察器:觀察該屬性的值是否越界;溢出捷沸;摊沉。。痒给。说墨。
*/
//先聲明兩個(gè)結(jié)構(gòu)體(存儲屬性),類(計(jì)算屬性)
structPoint {
//存儲屬性
varx:Double=0.0
vary:Double=0.0
}
structSize {
//存儲屬性
varwidth=0.0
varheight =0.0
}
//var rectangle = Rectangle(xxxx)
//rectangle.center = Point(x: 200, y:100)
classRectangle {
//左上頂點(diǎn)的坐標(biāo)
varorigin =Point()
//矩形的大小
varsize =Size()
//聲明描述矩形中心坐標(biāo)點(diǎn)計(jì)算型屬性
varcenter:Point{
// get方法(必須實(shí)現(xiàn);只實(shí)現(xiàn)get方法就是只讀性質(zhì))
get{
//計(jì)算中心的x和y值
letcenterX =origin.x+size.width/2
letcenterY =origin.y+size.height/2
returnPoint(x: centerX, y: centerY)
}
// set方法(可選)
//首先獲取要設(shè)置的值(Point結(jié)構(gòu)體對象)
// newCenter局部的常量(let)
//set(newCenter) {
////已知矩形的大小,修改左頂點(diǎn)屬性的值
//origin.x = newCenter.x - size.width/2
//origin.y = newCenter.y - size.height/2
//}
//簡單的set實(shí)現(xiàn); newValue:系統(tǒng)默認(rèn)提供的要賦值的對象
set{
//已知矩形的大小,修改左頂點(diǎn)屬性的值
origin.x= newValue.x-size.width/2
origin.y= newValue.y-size.height/2
}
}
funcgetArea() ->Double{
returnsize.width*size.height
}
//聲明只讀計(jì)算型屬性來描述矩形的面積
vararea:Double{
get{
returnsize.width*size.height
}
}
//自定義的構(gòu)造函數(shù)
init(origin:Point, size:Size) {
self.origin= origin
self.size= size
}
}
//實(shí)例化Rectangle對象
varrectangle =Rectangle(origin:Point(), size:Size(width:10, height:20))
rectangle.getArea()
rectangle.center.x
rectangle.center.y
rectangle.center=Point(x:10, y:20)
rectangle.origin.x
rectangle.origin.y
//類型屬性(type property):屬于某個(gè)類型(結(jié)構(gòu)體/類);不屬于任何一個(gè)實(shí)例對象
//需求:聲明Player玩家類,包含名字存儲屬性+玩家分?jǐn)?shù)存儲屬性;需要一個(gè)屬性記錄所有玩家的最高分?jǐn)?shù)(類型屬性);添加方法(記錄玩家的分?jǐn)?shù))
classPlayer {
//名字
varname:String
//分?jǐn)?shù)(某個(gè)實(shí)例對象)
varscore =0
//聲明類型屬性苍柏;記錄所有玩家的最高分?jǐn)?shù)
staticvarhightestScore =0
//構(gòu)造函數(shù)尼斧,初始化名字
init(name:String) {
self.name= name
}
//自定義一個(gè)方法
funcplay() {
// 0 ~ 99隨機(jī)整數(shù)
letscore =random()%100
print("\(name) played and got\(score) scores.")
//將之前的分?jǐn)?shù)累加到該玩家的分?jǐn)?shù)上
self.score+= score
print("Total score of\(name) is\(self.score)")
//將任意一個(gè)玩家的分?jǐn)?shù)和最高分比較
ifself.score>Player.hightestScore {
Player.hightestScore =self.score
}
print("Highest score is\(Player.hightestScore).")
print("====================")
}
}
//實(shí)例化兩個(gè)玩家
letfirstPlayer =Player(name:"Magician")
firstPlayer.play()
firstPlayer.play()
letsecondPlayer =Player(name:"Zombie")
secondPlayer.play()
secondPlayer.play()
03-property-observer
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
/*屬性觀察器*/
//var imUInt8:UInt8 = 2000
UInt8.max
UInt8.min
//需求:創(chuàng)建燈泡類,特定最大電流:20A(類型屬性);聲明存儲屬性试吁,包含屬性觀察器
classLightBulb {
staticletmaxCurrent =30
varcurrent =0{
willSet{
//將要設(shè)置的時(shí)候(newValue)
print("Current value will be changed! The change is\(abs(current- newValue))")
}
didSet{
//已經(jīng)設(shè)置完畢(oldValue)
print("Current value was changed and old Value is\(oldValue)")
ifcurrent>LightBulb.maxCurrent {
current=LightBulb.maxCurrent
//current = oldValue
print("New Value is\(current)")
}
}
}
}
//實(shí)例化
varlightBulb =LightBulb()
lightBulb.current=100
lightBulb.current=20
//延遲加載屬性
//需求:創(chuàng)建閉區(qū)間類;兩個(gè)存儲屬性,描述左區(qū)間和右區(qū)間(Int);聲明屬性棺棵,該屬性存儲整個(gè)閉區(qū)間所有整數(shù)和
/*
- (CLLocation *)userLocation {
if (_userLocaiton == nil) {
_userLocaiton = [[CLLocation alloc] init];
}
return _userLocaiton;
}
*/
classClosedRange {
letstart:Int
letend:Int
//var sum = 0
//延遲屬性
lazyvarsum:Int= {
print("start computing sum value")
varresult =0
foriinself.start...self.end{
result += i
}
returnresult
}()//不要忘記()
init(start:Int, end:Int) {
self.start= start
self.end= end
//
//for i in start...end {
//sum += i
//}
}
}
//實(shí)例化
varclosedRange =ClosedRange(start:0, end:100)
closedRange.sum
closedRange.sum
closedRange.sum
04-access-control
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
varstring:String=""
//創(chuàng)建App實(shí)例對象?
letapp =App(name:"Angry Bird")
app.name
app.show()
app.switchMode()
app.show()
//創(chuàng)建UI實(shí)例對象熄捍?無法訪問烛恤,原因是Internal
//let ui = UI(
05-singleton
importFoundation
publicclassGameManager {
//聲明公開的類型屬性
publicstaticletdefaultManager =GameManager()
publicvarscore =0
//聲明私有的構(gòu)造函數(shù)
privateinit() {
//.....
}
publicfuncaddScore() {
self.score+=10
}
}
Day04
回顧:
1.枚舉: 關(guān)聯(lián)類型(常用)
2.結(jié)構(gòu)體: 屬性; 自定義構(gòu)造方法;自定義方法; 可失敗的構(gòu)造方法; mutating關(guān)鍵詞(修改結(jié)構(gòu)體中的屬性)
新內(nèi)容:類
1. 面向?qū)ο蟮娜齻€(gè)特點(diǎn):封裝余耽、繼承和多態(tài)
2. OC添加屬性兩個(gè)分類:存儲屬性(stored property)和計(jì)算屬性(computed property)
.m 文件中
@interface viewControll: UIViewController {
NSString *newString;
}
@property (nonatomic, strong) NSString *string;
—> 自動(dòng)會(huì)創(chuàng)建set/get方法缚柏;自動(dòng)創(chuàng)建_string屬性
3.樣例:Swift語言中如何創(chuàng)建類/實(shí)例對象?
[ 01-class-basic ]
-> 創(chuàng)建類宾添,可以不繼承任何類
4.樣例:如何添加計(jì)算型屬性;類型屬性; 屬性觀察器....
[ 02-property ]
1. 屬性觀察器(property observer): 對存儲屬性的值的變化Set做出觀察和響應(yīng)的反應(yīng)(邏輯)
-> 觀察:willSet: 在設(shè)置存儲屬性值之前
-> 響應(yīng):didSet:已經(jīng)設(shè)置完存儲屬性值
2.樣例:如何實(shí)現(xiàn)”屬性觀察器”機(jī)制柜裸; 延遲加載屬性
[ 03-property-observer ]
3.訪問控制權(quán)限(access control)
-> 對象: 結(jié)構(gòu)體/類/屬性/方法
-> 目的:
a. SDK(Software Development Kit:軟件開發(fā)包): public(公開)
b. Framework(框架)中的h文件缕陕,能看到,public/internal
-> 三種訪問權(quán)限:
a. private:私有疙挺;限定到某個(gè)文件xxxx.swift
b. internal:內(nèi)部(缺省Default權(quán)限); 限定到某個(gè)Module(模塊); App bundle(Module); Framework(Module)
c. public:公開的扛邑;幾乎沒有限定
4.樣例:創(chuàng)建兩個(gè)類,設(shè)置不同的訪問權(quán)限铐然;
[ 04-access-control ]
-> playground: Module/File
5.單例Singleton:一種設(shè)計(jì)模式蔬崩,某個(gè)類只創(chuàng)建一個(gè)實(shí)例對象Instance
[UIApplicationsharedApplication]
[NSFileManagerdefaultManager]
[NSUserDefaultstanstardUserDefault]
—> OC中創(chuàng)建單例對象的方法
a. 常用的使用static創(chuàng)建-> 線程不安全
b. GCD中dispatch_once一次性任務(wù) -> 線程安全
c. 加鎖 synchronize
d. 實(shí)現(xiàn)initialization方法實(shí)現(xiàn)
6.樣例:如何創(chuàng)建單例對象;
[ 05-singleton ]
-> init構(gòu)造函數(shù)(private);
-> 聲明屬性(let)
Day04知識點(diǎn):
—> 類聲明/創(chuàng)建相關(guān):
1.聲明:使用class關(guān)鍵詞恶座,添加自定義構(gòu)造函數(shù);添加自定義方法沥阳;
2.創(chuàng)建:使用自定義構(gòu)造函數(shù)創(chuàng)建類的實(shí)例對象
3.類對象的等價(jià)性:使用===或者!==來判定兩個(gè)引用類型是否等價(jià); 如果兩個(gè)引用類型指向內(nèi)存中同一片內(nèi)存空間跨琳,表示等價(jià),即===返回true; 否則返回false
—> 屬性相關(guān):
1. 存儲屬性(stored property): var/let修飾桐罕,存儲某個(gè)值
-> 添加屬性觀察器(property observer):willSet/didSet
2. 計(jì)算屬性(computed property): get/set兩個(gè)方法脉让,去獲取/設(shè)置屬性(自己/其它屬性)
3. 類型屬性(type property):static修飾
4. 延遲加載屬性(lazy property): 和OC中的懶加載思路一致
—>場景:
a. 當(dāng)某個(gè)屬性(延遲屬性)的初始化依賴于其它的屬性初始化
b. 當(dāng)某個(gè)屬性(延遲屬性)的計(jì)算耗時(shí)(占用資源), 不應(yīng)該在類的初始化階段計(jì)算
->描述:在類的初始化階段,不賦值功炮;直到使用/創(chuàng)建的時(shí)候才賦值溅潜;只賦值一次
->語法:關(guān)鍵詞lazy;
—> 訪問權(quán)限(access control)相關(guān)
1. 一般原則:統(tǒng)統(tǒng)先設(shè)定為private(結(jié)構(gòu)體/類/屬性/方法),限定到某個(gè)文件內(nèi)部可見薪伏;希望暴露哪個(gè)屬性/方法滚澜,再設(shè)置為public
—> 創(chuàng)建單例:
1.語法:
a. 將init構(gòu)造函數(shù)設(shè)置為private權(quán)限,init方法的調(diào)用限定在文件內(nèi)部
b. 聲明公開的類型屬性(static)嫁怀,使用let修飾设捐,保證只可以初始化一次
2.樣例如下:
publicclassGameManager {
//聲明公開的類型屬性
publicstaticletdefaultManager =GameManager()
publicvarscore =0
//聲明私有的構(gòu)造函數(shù)
privateinit() {
//.....
}
publicfuncaddScore() {
self.score+=10
}
}