進(jìn)階17 Swift2

Swift中"?"和"!"

  • 1.在swift中可選(optionals)類型猾昆,用"?"表示陶因,用于處理值缺失的情況,表示“這兒有一個(gè)值垂蜗,且它等于x”或者表示“這兒沒有值”
  • 2.可選類型是一個(gè)包含兩種情況的枚舉值––None和Some楷扬,用來表示 可能有值 或 可能沒有值。
    • 2.1 nil 就是 Optional.None,當(dāng)你聲明一個(gè)可選變量或者可選屬性的時(shí)候贴见,沒有提供初始值烘苹,它的值默認(rèn)為nil
  • 2.2 非nil 就是Optional.Some
  • 3.任何類型都可以明確的聲明為可選類型,當(dāng)聲明一個(gè)可選類型的時(shí)候片部,要確保用括號給"?"操作符一個(gè)合適的范圍镣衡。例如:聲明可選整數(shù)數(shù)組,應(yīng)該寫成"(Int[])?"档悠,如果寫成“Int[]?”,就會(huì)報(bào)錯(cuò)
//定義一個(gè)可選類型:以下兩種聲明方式是相等的
var Optional_1:Int?//在數(shù)據(jù)類型和"?"之間沒有空格
var Optional_2:Optional<Int>
  • 4."!":用來表示強(qiáng)制解析廊鸥,如果可選類型實(shí)例包含一個(gè)值,可以用"?"來訪問這個(gè)值
    //注意:如果可選類型在無值的情況下進(jìn)行強(qiáng)制解析站粟,會(huì)導(dǎo)致崩潰
var intNumber:Int? = 8
var result = intNumber!
print(result)
  • 5.自動(dòng)解析(隱式解析)
 - 5.1 你可以在聲明可選變量時(shí)黍图,使用"!"來替換"?",這樣可選變量在使用時(shí)就不需要再加一個(gè)"!"來取值了奴烙,他會(huì)自動(dòng)解析
 - 5.2 隱式解析可選類型好人可選類型一樣助被,都是有值和沒有值(nil)兩種結(jié)果
 - 5.3 區(qū)別是賦值時(shí)剖张,隱式解析可選類型不需要再強(qiáng)制解析
 - 5.4 注意:隱式解析可選類型的變量沒有值時(shí),程序一樣會(huì)崩潰
var IntNumberOne:Int! = 10
print(IntNumberOne)
  • 6.可選綁定
  • 6.1 可選綁定:用來判斷可選類型是否包含值揩环,如果包含就把值賦給一個(gè)臨時(shí)常量或者臨時(shí)變量搔弄。
  • 6.2 可選綁定可以用在if 和 while 語句中來對可選類型的值進(jìn)行判斷,并把它賦給一個(gè)常量或者變量
  • 6.3 如果你不確定可選類型是否有值丰滑,用可選綁定顾犹,不需要對可選類型強(qiáng)制解析
var intNumberTwo:Int?
if var intNumberThree = intNumberTwo{
    print("可選類型有值 = \(intNumberThree)")
}else{
    print("可選類型無值")
}

Swift中的結(jié)構(gòu)體

  • 1.與 C 和 OC 不同的是:
 - 1.1 結(jié)構(gòu)體不需要實(shí)現(xiàn)文件和接口文件
 - 1.2 結(jié)構(gòu)體允許我們創(chuàng)建一個(gè)單一文件,且系統(tǒng)會(huì)自動(dòng)生成該結(jié)構(gòu)體用于面向其他代碼的外部接口
  • 2.結(jié)構(gòu)體總是通過被復(fù)制的方式在代碼中傳遞褒墨,因此炫刷,原本結(jié)構(gòu)的值是不可修改的
  • 3.結(jié)構(gòu)體的應(yīng)用
    • 3.1 在代碼中,可以使用結(jié)構(gòu)體定義你的自定義數(shù)據(jù)類型
    • 3.2 按照通用的準(zhǔn)則郁妈,當(dāng)符合一條或者多條以下條件下時(shí)浑玛,請考慮構(gòu)建結(jié)構(gòu)體
    • 3.2.1 結(jié)構(gòu)體的主要目的是用來封裝少量相關(guān)簡單數(shù)據(jù)
    • 3.2.2 有理由預(yù)計(jì)一個(gè)結(jié)構(gòu)體實(shí)例在賦值或者傳遞時(shí),封裝的數(shù)據(jù)將會(huì)被拷貝而不是引用
    • 3.2.3 任何結(jié)構(gòu)體中存儲(chǔ)的值類型屬性噩咪,也將會(huì)被拷貝顾彰,而不是被引用
    • 3.2.4 結(jié)構(gòu)體不需要去繼承另一個(gè)已存在類型的屬性或者行為
  • 4.例如:
  • 4.1 幾何形狀的大小,封裝一個(gè)width屬性和height屬性胃碾,兩者均為Double類型
  • 4.2 一定范圍的路徑涨享,封裝一個(gè)Start屬性和length屬性,兩者均為Int類型
  • 4.3 三維坐標(biāo)系內(nèi)的一點(diǎn)仆百,x,y,z屬性厕隧,三者均為Double類型
//聲明一個(gè)結(jié)構(gòu)體
struct pointOf3D {
    //聲明結(jié)構(gòu)體變量的屬性(存儲(chǔ)屬性)
    var X:Double
    var Y:Double
    var Z:Double
}
var point:pointOf3D = pointOf3D(X: 10, Y: 11, Z: 12)

//聲明一個(gè)結(jié)構(gòu)體
struct Rect {
    var point:(x:Int,y:Int) = (0,0)
    var size:(w:Int,h:Int) = (0,0)
    
    //成員方法
    func getSize(){
        print(size)
    }
    
    //類方法:用static修飾
    static func sayHello(){
        print("hello")
    }
}
var rect2:Rect = Rect(point: (10,10), size: (50,50))

//調(diào)用成員方法
rect2.getSize()

//調(diào)用類方法(類方法用類名直接調(diào)用,在結(jié)構(gòu)體里用結(jié)構(gòu)體調(diào)用)
Rect.sayHello()

Swift中的類

  • 1.swift中儒旬,類和結(jié)構(gòu)體有很多共同點(diǎn)
 - 1.1 定義屬性栏账,用于存儲(chǔ)值
 - 1.2 定義方法,用于提供功能
 - 1.3 定義構(gòu)造器栈源,用于提供初始化值
 - 1.4 遵循協(xié)議挡爵,用來對某個(gè)類提供標(biāo)準(zhǔn)功能
 - 1.5 通過擴(kuò)展,用來增加默認(rèn)實(shí)現(xiàn)的功能
  • 2.與結(jié)構(gòu)體相比甚垦,又有其他附加功能
    • 2.1 繼承允許一類繼承另一個(gè)類的特征
    • 2.2 類型轉(zhuǎn)換允許在允許時(shí)檢查和解釋一個(gè)類實(shí)現(xiàn)的類型
    • 2.3 引用計(jì)數(shù):允許對一個(gè)類多次引用
//定義一個(gè)雷:使用class修飾類
class Person{
    var name:String?
    var gender:String?
    var age:Int?
}
  • 3.值類型
- 3.1 該類型的每個(gè)實(shí)例持有數(shù)據(jù)的副本茶鹃,并且該副本對于每個(gè)實(shí)例來說都是唯一的一份,比如結(jié)構(gòu)體艰亮,枚舉闭翩,元組都是值類型
- 3.2 值類型的使用場景
     - 3.2.1 當(dāng)使用“==”運(yùn)算符比較實(shí)例數(shù)據(jù)的時(shí)候
     - 3.2.2 想單獨(dú)賦值一份實(shí)例數(shù)據(jù)的時(shí)候
     - 3.2.3 在多線程環(huán)境下操作數(shù)據(jù)的時(shí)候
struct StructObject {
    var data:Int = -1
}
var value_1 = StructObject()

//將value_1的值賦給value_2,就是一個(gè)拷貝的過程
var value_2 = value_1
print(value_2)

//value_1的數(shù)據(jù)改變迄埃,而value_2沒有改變
value_1.data = 1
print("\(value_1.data)...\(value_2.data)")
  • 4.引用類型
    該類型的實(shí)例共享數(shù)據(jù)唯一的一份副本疗韵。比如說類(class)就是引用類型
class ClassObject {
    var data:Int = -1
}
var cob_1 = ClassObject()

//將cob_1變量的值賦給cob_2,就是引用的過程
var cob_2 = cob_1

//將cob_1的值改變,cob_2的值也改變了
cob_1.data = 4
print("\(cob_1.data)...\(cob_2.data)")
  • 5.類的定義和構(gòu)造方法
//定義一個(gè)類
class animal{
    var kind:String?
    var name:String?
    
    //類的構(gòu)造方法(類似初始化方法)侄非,與OC中的構(gòu)造器不同蕉汪,Swift的構(gòu)造器無需返回值流译,他們的主要任務(wù)是保證新實(shí)例在第一次使用前完成正確的初始化
    init(kind:String,name:String){
        self.kind = kind
        self.name = name
    }
}

//創(chuàng)建實(shí)例對象
var lion = animal(kind: "大型貓科", name: "獅子")
//訪問對象的屬性
print(lion.name)
  • 6.存儲(chǔ)屬性:存儲(chǔ)屬性就是類或者結(jié)構(gòu)體里定義的變量(或者常量)
- 6.1 存儲(chǔ)屬性可以是變量存儲(chǔ)屬性(var修飾),也可以是常量存儲(chǔ)屬性(let修飾)
-  6.2 可以在定義存儲(chǔ)屬性的時(shí)候指定默認(rèn)值
- 6.3 也可以在構(gòu)造過程中設(shè)置或修改存儲(chǔ)屬性的值
  • 7.計(jì)算屬性:不直接存儲(chǔ)值者疤,而是提供一個(gè)getter 和一個(gè)可選的setter福澡,來間接獲取和設(shè)置其他屬性常量或變量的值

class Docter{
    //類方法
    static var age:Int?
    
    //對象方法
    var name:String?
    
    //計(jì)算屬性
    var Number:String{
        get{
            return name!
        }
        set(value){//這種寫法表示在調(diào)用Number的set方法時(shí),傳過來的參數(shù)會(huì)賦給value
            name = value//切記:set\get方法中萬不能適應(yīng)"self.屬性"驹马,會(huì)造成遞歸
        }
    }
    
    //類方法:類方法中革砸,不能使用對象屬性,只能使用類屬性
    static func kanBing(){
        print(age)
    }
    class func daZhen(){
        print(age)
    }
    
    //構(gòu)造方法:不能使用類屬性
    init(name:String,age:Int){
        self.name = name
    }
    
    //對象方法
    func shuYe(){
        print("對象方法")
    }
}

//繼承
class nurse:Docter{
    //重寫父類方法糯累,一定要在方法前加override
    override class func daZhen(){
        print("我是子類算利,重寫了父類的class func daZhen()方法,用override修飾")
    }
}
nurse.daZhen()

Swift中的協(xié)議

  • 1.類寇蚊、結(jié)構(gòu)體笔时、枚舉都可以遵循協(xié)議,并提供具體實(shí)現(xiàn)來完成協(xié)議定義的方法和功能
  • 2.任意能夠滿足協(xié)議要求的類型仗岸,被稱為遵循(conform)這個(gè)協(xié)議
  • 3.使用“@objc”修飾的協(xié)議,其中的方法借笙,可以聲明成可選實(shí)現(xiàn)(用optional修飾)
//帶有可選實(shí)現(xiàn)函數(shù)的協(xié)議
@objc protocol Men{
    func cook()//做飯
    func wash()//洗衣服
    optional func hitDouDou()//打豆豆
}

//必須全部實(shí)現(xiàn)函數(shù)的協(xié)議
protocol Divid{
    func lookAfterKid()
}

//要遵循某個(gè)協(xié)議扒怖,如果類在遵循協(xié)議的同時(shí)擁有父類,應(yīng)該將父類名放在協(xié)議之前业稼,用逗號分隔盗痒,例如:
//聲明一個(gè)doc類,繼承于Docter低散,且遵守Men和Divid
class doc:Docter,Men,Divid {
    //Men協(xié)議下的兩個(gè)方法(optional修飾的方法俯邓,可實(shí)現(xiàn),也可不實(shí)現(xiàn))
    @objc func cook() {
        print("做飯")
    }
    @objc func wash() {
        print("洗衣服")
    }
    
    //Divid寫一下的一個(gè)方法熔号,必須實(shí)現(xiàn)
    func lookAfterKid() {
        print("照顧孩子")
    }
}
let doc_1:doc = doc(name: "大衛(wèi)", age: 33)
doc_1.cook()
doc_1.wash()
doc_1.lookAfterKid()

Swift中的擴(kuò)展

擴(kuò)展(Extension)
  • 1.extension + 類名或者結(jié)構(gòu)體名(可以對一個(gè)類或者結(jié)構(gòu)體擴(kuò)展方法)
  • 2.extension可以多次對一個(gè)類進(jìn)行擴(kuò)展稽鞭,也可以一個(gè)類擴(kuò)展協(xié)議方法
  • 3.擴(kuò)展就是向一個(gè)已有的類、結(jié)構(gòu)體引镊、枚舉添加新功能
  • 4.擴(kuò)展可以對一個(gè)類型添加新功能朦蕴,但是不能重寫已有的功能
//1.對一個(gè)類進(jìn)行方法的擴(kuò)展(添加方法)
extension doc{
    //擴(kuò)展一個(gè)對象方法
    func say(){
        print("I Love U")
    }
    
    //擴(kuò)展一個(gè)類方法
    class func eat() {
        print("I want to eat something")
    }
}
doc_1.say()
doc.eat()//類方法用類名直接調(diào)用

//2.擴(kuò)展一個(gè) 類遵循的協(xié)議 中的方法
extension doc{
    @objc func Magic(){
        print("變魔術(shù)")
    }
}
doc_1.Magic()

Swift中的閉包

  • 1.閉包:是自包含的函數(shù)代碼塊,可以在代碼中被傳遞弟头、使用
  • 2.swift中的閉包吩抓,和OC中的block以及其他語言中的匿名函數(shù)類似
  • 3.閉包可以捕獲和存儲(chǔ)其所在上下文中任意的常量和變量(閉合并包裹著這些常量和變量)
  • 4.swift會(huì)幫你管理在捕獲過程中涉及到的內(nèi)存操作
  • 5.格式:
    {(參數(shù)名:類型)->返回值類型 in
    需要執(zhí)行的代碼
    }
  • 6.例如:
    let backString = {(name:String)-> String in
    return name
    }
  • 7.in:閉包的函數(shù)體部分由關(guān)鍵字in引入,該關(guān)鍵字表示閉包的參數(shù)和返回值類型定義已經(jīng)完成赴恨,閉包函數(shù)體即將開始
//求兩個(gè)數(shù)的最大值(三目運(yùn)算符)
//(a:Int,b:Int)->Int是maxResult的函數(shù)類型
var maxResult:((a:Int,b:Int)->Int)

//第一種方式
maxResult = {(a:Int,b:Int)->Int in
    return a > b ? a : b
}
print(maxResult(a: 3, b: 5))

//第二種方式
maxResult = {
    a,b in
    return a > b ? a : b
}
print(maxResult(a: 3, b: 5))

//第三種方式
maxResult = {
    a,b in
    a > b ? a : b
}
print(maxResult(a: 3, b: 5))

//第四種方式
maxResult = {
    (a,b)->Int in
    return a > b ? a : b
}
print(maxResult(a: 3, b: 5))

//第五種方式
maxResult = {
    $0 > $1 ? $0 : $1
}
print(maxResult(a: 3, b: 5))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疹娶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伦连,更是在濱河造成了極大的恐慌雨饺,老刑警劉巖挣饥,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沛膳,居然都是意外死亡扔枫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門锹安,熙熙樓的掌柜王于貴愁眉苦臉地迎上來短荐,“玉大人,你說我怎么就攤上這事叹哭∪趟危” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵风罩,是天一觀的道長糠排。 經(jīng)常有香客問我,道長超升,這世上最難降的妖魔是什么入宦? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮室琢,結(jié)果婚禮上乾闰,老公的妹妹穿的比我還像新娘。我一直安慰自己盈滴,他們只是感情好涯肩,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巢钓,像睡著了一般病苗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上症汹,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天硫朦,我揣著相機(jī)與錄音,去河邊找鬼烈菌。 笑死阵幸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芽世。 我是一名探鬼主播挚赊,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼济瓢!你這毒婦竟也來了荠割?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔑鹦,沒想到半個(gè)月后夺克,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚎朽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年铺纽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哟忍。...
    茶點(diǎn)故事閱讀 40,973評論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狡门,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锅很,到底是詐尸還是另有隱情其馏,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布爆安,位于F島的核電站叛复,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扔仓。R本人自食惡果不足惜褐奥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望当辐。 院中可真熱鬧抖僵,春花似錦、人聲如沸缘揪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽找筝。三九已至,卻和暖如春慷吊,著一層夾襖步出監(jiān)牢的瞬間袖裕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工溉瓶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留急鳄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓堰酿,卻偏偏與公主長得像疾宏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子触创,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評論 2 361

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