進(jìn)階17 Swift2

Swift中"?"和"!"

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

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)體總是通過(guò)被復(fù)制的方式在代碼中傳遞,因此,原本結(jié)構(gòu)的值是不可修改的
  • 3.結(jié)構(gòu)體的應(yīng)用
    • 3.1 在代碼中,可以使用結(jié)構(gòu)體定義你的自定義數(shù)據(jù)類型
    • 3.2 按照通用的準(zhǔn)則,當(dāng)符合一條或者多條以下條件下時(shí),請(qǐng)考慮構(gòu)建結(jié)構(gòu)體
    • 3.2.1 結(jié)構(gòu)體的主要目的是用來(lái)封裝少量相關(guān)簡(jiǎ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é)議,用來(lái)對(duì)某個(gè)類提供標(biāo)準(zhǔn)功能
 - 1.5 通過(guò)擴(kuò)展,用來(lái)增加默認(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ù):允許對(duì)一個(gè)類多次引用
//定義一個(gè)雷:使用class修飾類
class Person{
    var name:String?
    var gender:String?
    var age:Int?
}
  • 3.值類型
- 3.1 該類型的每個(gè)實(shí)例持有數(shù)據(jù)的副本,并且該副本對(duì)于每個(gè)實(shí)例來(lái)說(shuō)都是唯一的一份,比如結(jié)構(gòu)體,枚舉,元組都是值類型
- 3.2 值類型的使用場(chǎng)景
     - 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è)拷貝的過(guò)程
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ù)唯一的一份副本。比如說(shuō)類(class)就是引用類型
class ClassObject {
    var data:Int = -1
}
var cob_1 = ClassObject()

//將cob_1變量的值賦給cob_2,就是引用的過(guò)程
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ú)需返回值,他們的主要任務(wù)是保證新實(shí)例在第一次使用前完成正確的初始化
    init(kind:String,name:String){
        self.kind = kind
        self.name = name
    }
}

//創(chuàng)建實(shí)例對(duì)象
var lion = animal(kind: "大型貓科", name: "獅子")
//訪問(wèn)對(duì)象的屬性
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)造過(guò)程中設(shè)置或修改存儲(chǔ)屬性的值
  • 7.計(jì)算屬性:不直接存儲(chǔ)值,而是提供一個(gè)getter 和一個(gè)可選的setter,來(lái)間接獲取和設(shè)置其他屬性常量或變量的值

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

//繼承
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)來(lái)完成協(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é)議之前,用逗號(hào)分隔,例如:
//聲明一個(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)體名(可以對(duì)一個(gè)類或者結(jié)構(gòu)體擴(kuò)展方法)
  • 2.extension可以多次對(duì)一個(gè)類進(jìn)行擴(kuò)展,也可以一個(gè)類擴(kuò)展協(xié)議方法
  • 3.擴(kuò)展就是向一個(gè)已有的類、結(jié)構(gòu)體、枚舉添加新功能
  • 4.擴(kuò)展可以對(duì)一個(gè)類型添加新功能,但是不能重寫已有的功能
//1.對(duì)一個(gè)類進(jìn)行方法的擴(kuò)展(添加方法)
extension doc{
    //擴(kuò)展一個(gè)對(duì)象方法
    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以及其他語(yǔ)言中的匿名函數(shù)類似
  • 3.閉包可以捕獲和存儲(chǔ)其所在上下文中任意的常量和變量(閉合并包裹著這些常量和變量)
  • 4.swift會(huì)幫你管理在捕獲過(guò)程中涉及到的內(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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容