Swift基礎(chǔ)2

本文接著上一篇,對(duì)Swift的結(jié)構(gòu)體、類、協(xié)議、擴(kuò)展、枚舉以及閉包做一個(gè)簡(jiǎn)單的介紹。

七、結(jié)構(gòu)體

Swift的結(jié)構(gòu)體對(duì)比OC來(lái)說(shuō),可以添加初始化方法、可以遵守代理協(xié)議。

結(jié)構(gòu)體的聲明

格式:

struct + 結(jié)構(gòu)體的名字 + {
    聲明成員變量(屬性和方法)
}

聲明一個(gè)結(jié)構(gòu)體

struct Trainee {
    //存儲(chǔ)屬性: 僅僅做儲(chǔ)存值的作用
    var name : String
    var gender : String
    var height : Float
    var weight : Float
    
    //計(jì)算屬性: 通過(guò)計(jì)算獲得自己的值
    //設(shè)置屬性的set和get方法
    //屬性里面的set方法不能單獨(dú)存在,必須有一個(gè)同屬性的get方法存在之后才可以寫set方法
    var bmi : Float {
        get{
            return weight / (height * height)
        }
        set{
            self.bmi = newValue      
        }
    }
    
    //結(jié)構(gòu)體屬性
    //結(jié)構(gòu)體屬性不能在普通的函數(shù)里面去調(diào)用
//    static var condition : String? = nil
    static var condition : String = "正常"
    
    //init函數(shù)
    init(name newName : String, gender newGender : String, height newHeight : Float, weight newWeight : Float) {
        self.name = newName  //函數(shù)內(nèi)部使用內(nèi)部參數(shù)名,不能使用外部參數(shù)名
        self.gender = newGender  
        self.height = newHeight
        weight = newWeight  //如果不加self. 會(huì)默認(rèn)為 self.weight
    }
   
    //Swift的結(jié)構(gòu)體可以任意地創(chuàng)建函數(shù)
    //成員方法(普通的函數(shù))
    func heheda() {
        print("成員方法")
    }
    
    //如果需要在函數(shù)里面修改屬性的值的話,需要在函數(shù)前面添加mutating關(guān)鍵字修飾
    mutating func change() {
        self.name = "??"
    }
    
    
    
    //結(jié)構(gòu)體的類方法(結(jié)構(gòu)體函數(shù))    比成員方法多了static的修飾
    static func introduce() {
        self.name = "猿"
        print(self.name)
    }
    //結(jié)構(gòu)體函數(shù)里面不能調(diào)用普通的屬性
    //結(jié)構(gòu)體函數(shù)里面可以調(diào)用結(jié)構(gòu)體屬性
    //結(jié)構(gòu)體函數(shù)里面可以調(diào)用一些本結(jié)構(gòu)體存在的屬性
    
    
    static var talent : String? = nil
    static func talentEvaluate(){
        introduce()
        self.talent = "Du bist nicht dumm"
        print(talent)
        //print(self.talent) //這兩行打印效果一樣
    }

    
}

構(gòu)造結(jié)構(gòu)體的兩種方式

var trainee : Trainee = Trainee.init(name: "Sven", gender: "male", height: 1.86, weight: 66)
print(trainee.bmi)
print(trainee.name)

var trainee1 : Trainee = Trainee(name: "Sven", gender: "male", height: 1.86, weight: 66)
print(trainee1.bmi)

調(diào)用結(jié)構(gòu)體的成員方法

trainee.change()
print(trainee.name)

結(jié)構(gòu)體的類方法用類名調(diào)用

Trainee.introduce()
Trainee.talentEvaluate()

八、類

Swift中用class來(lái)定義類
格式: class 關(guān)鍵字 + 類名 { 類的實(shí)現(xiàn) }

class Person {
    //在類里面創(chuàng)建一個(gè)屬性的時(shí)候,必須有初值,如果不想設(shè)置初值,那么就設(shè)置成可選類型
    var name : String? = nil
    var age : Int? = nil
    //private修飾的屬性是私有屬性
    private var gender : String? = nil
    //static修飾的屬性是類屬性
    static var hobby : String? = nil
    
    init(name newName : String, age newAge : Int){
        name = newName
        age = newAge
    }
    
    //實(shí)例方法里面不能直接調(diào)用類屬性
    //實(shí)例方法可以直接對(duì)實(shí)例對(duì)象進(jìn)行修改賦值
    func sayGender(){
        self.gender = "女"
        print(self.gender)
    }
    //在函數(shù)聲明之前添加一個(gè)private 表示私有方法
    private func showGender(){
        self.gender = "女"
        print(self.gender)
    }
    
    //static修飾的是類方法
    //static修飾的類方法是不可以被子類重寫的
    static func sayHobby() {
        self.hobby = "hiking"
        print(self.hobby)
    }
    
    //class修飾的也是類方法
    //class修飾的類方法可以被子類重寫
    class func showHobby() {
        self.hobby = "Mounting"
        print(self.hobby)
    }
}

let person : Person = Person(name: "Silvia", age: 22)

person.sayGender()
person.showGender()
Person.sayHobby()
Person.showHobby()

class Designer: Person {
    //如果想在子類中重寫父類方法要加override修飾
    override init(name newName: String, age newAge: Int) {
        super.init(name: newName, age: newAge)
        
    }

    //這樣會(huì)報(bào)錯(cuò):
//    override static func sayHobby() {
//    }
    
    override class func showHobby() {
        
    }
}

九、協(xié)議

Swift里面協(xié)議中方法必須全部實(shí)現(xiàn) OC有必須實(shí)現(xiàn)的方法和選擇性實(shí)現(xiàn)的方法
格式:
protocol關(guān)鍵字 + 協(xié)議名字

protocol myDelegate{
    //協(xié)議方法前面添加mutating修飾的關(guān)鍵字之后,可以修改結(jié)構(gòu)體里面的參數(shù),在類里面會(huì)自動(dòng)地忽略mutating
    mutating func letsGo()
    
//    func keepMoving() -> String
}
//如果有需要可選實(shí)現(xiàn)的協(xié)議
//在最前面添加 @objc 修飾,內(nèi)部的方法用optional修飾可選實(shí)現(xiàn)的方法,其他的不變   (這樣變成了OC的協(xié)議)
@objc protocol newDelegate{
    optional func heheda()
}


//如果一個(gè)類既有父類又遵守了某個(gè)協(xié)議,那么格式是
//class + 類名:父類,協(xié)議名字     如果有多個(gè)協(xié)議,協(xié)議之間用逗號(hào)隔開
class Engineer: Person, myDelegate, newDelegate {
    func letsGo() {
        
    }
}

class newClass: myDelegate {
    func letsGo() {
        
    }
}

//結(jié)構(gòu)體可以遵守協(xié)議
//但是結(jié)構(gòu)體只能遵守Swift的協(xié)議
struct newStruct : myDelegate {
    var name : String
    mutating func letsGo() {
        self.name = "Stuttgart"
    }
}    

十、擴(kuò)展

extension可以給一個(gè)類添加新的方法,但不可以添加新的屬性

extension + 類名(結(jié)構(gòu)體名字)可以對(duì)一個(gè)類和結(jié)構(gòu)體擴(kuò)展方法
extension可以多次對(duì)一個(gè)類進(jìn)行擴(kuò)展,也可以給一個(gè)類擴(kuò)展協(xié)議方法

    
extension newStruct{
        func park(){
        print("park now")
    }
}

let somebody = newStruct(name: "Silvia")
somebody.park()



extension可以給一個(gè)類拓展新的協(xié)議

//先聲明一個(gè)名為MyProtocol的協(xié)議
@objc protocol MyProtocol {
    optional func test1() //
    func test2()
}

extension Engineer : MyProtocol {
    @objc func test2() {
        print("擴(kuò)展新的協(xié)議")
    }
}

let engineer = Engineer(name: "Lorraine", age: 22)
engineer.test2()

十一、枚舉

Swift的枚舉沒(méi)有默認(rèn)的0,1,2,3...

enum animal{
    case cat
    case tiger
    case dog
    case horse
}
//使用枚舉的時(shí)候,初次給變量賦值,必須使用枚舉名.case名
var animal1 = animal.cat
//第二次使用的時(shí)候,可以直接通過(guò).case名使用
animal1 = .horse

switch搭配枚舉使用

switch的value要填寫一個(gè)枚舉類型的實(shí)例變量
case .枚舉的case名字

switch animal1 {
case .cat:        //沒(méi)代碼提示,較容易出錯(cuò)
    print("貓")
case .tiger:
    print("虎")
case .dog:
    print("??")
case .horse:
    print("??")
}

十二、閉包

閉包是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用。
Swift中的閉包相當(dāng)于C和OC中的block代碼塊,與其他一些編程語(yǔ)言中的匿名函數(shù)比較相似。(另:拆包是可選類型,與閉包不是一回事)

閉包可以捕獲和存儲(chǔ)其所在上下文中任意常量和變量的引用。這就是所謂的閉合并包裹著這些常量和變量,俗稱閉包。Swift會(huì)管理在捕獲過(guò)程中涉及到的所有內(nèi)存操作。

閉包表達(dá)式格式:
閉包名字: ((參數(shù)) -> 返回值類型)

var newPassValue : ((a : Int, b : Int ) -> Int)

閉包有5種寫法

//第一種閉包表達(dá)式的寫法  (最全的寫法)
newPassValue = { (a : Int, b : Int) -> Int in
    return a > b ? a : b
}

//第二種寫法 這是蘋果推薦的寫法
newPassValue = { (a , b) -> Int in
    return a > b ? a : b
}

//第三種寫法
newPassValue = {
    $0 > $1 ? $0 : $1
}

//第四種寫法
newPassValue = { (a , b) in
    return a > b ? a : b
}

//第五種寫法 (省略內(nèi)容最多的一種)
newPassValue = { (a , b) in
    a > b ? a : b
}
最后編輯于
?著作權(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)容