Swift 2.0 day04

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

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眶掌,隨后出現(xiàn)的幾起案子挡育,更是在濱河造成了極大的恐慌,老刑警劉巖朴爬,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件即寒,死亡現(xiàn)場離奇詭異,居然都是意外死亡召噩,警方通過查閱死者的電腦和手機(jī)母赵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來具滴,“玉大人凹嘲,你說我怎么就攤上這事」乖希” “怎么了周蹭?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疲恢。 經(jīng)常有香客問我凶朗,道長,這世上最難降的妖魔是什么显拳? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任棚愤,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宛畦。我一直安慰自己瘸洛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布次和。 她就那樣靜靜地躺著反肋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斯够。 梳的紋絲不亂的頭發(fā)上囚玫,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音读规,去河邊找鬼抓督。 笑死,一個(gè)胖子當(dāng)著我的面吹牛束亏,可吹牛的內(nèi)容都是我干的铃在。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼碍遍,長吁一口氣:“原來是場噩夢啊……” “哼定铜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怕敬,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤揣炕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后东跪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畸陡,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年虽填,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丁恭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斋日,死狀恐怖牲览,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恶守,我是刑警寧澤第献,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站兔港,受9級特大地震影響庸毫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜押框,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一岔绸、第九天 我趴在偏房一處隱蔽的房頂上張望理逊。 院中可真熱鬧橡伞,春花似錦盒揉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挂脑,卻和暖如春藕漱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崭闲。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工肋联, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刁俭。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓橄仍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牍戚。 傳聞我的和親對象是個(gè)殘疾皇子侮繁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容