Swift基礎(chǔ)2

本文接著上一篇清焕,對(duì)Swift的結(jié)構(gòu)體、類(lèi)祭犯、協(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方法存在之后才可以寫(xiě)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ù)里面修改屬性的值的話(huà)咏删,需要在函數(shù)前面添加mutating關(guān)鍵字修飾
    mutating func change() {
        self.name = "??"
    }
    
    
    
    //結(jié)構(gòu)體的類(lèi)方法(結(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)體的類(lèi)方法用類(lèi)名調(diào)用

Trainee.introduce()
Trainee.talentEvaluate()

八惹想、類(lèi)

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

class Person {
    //在類(lèi)里面創(chuàng)建一個(gè)屬性的時(shí)候,必須有初值督函,如果不想設(shè)置初值嘀粱,那么就設(shè)置成可選類(lèi)型
    var name : String? = nil
    var age : Int? = nil
    //private修飾的屬性是私有屬性
    private var gender : String? = nil
    //static修飾的屬性是類(lèi)屬性
    static var hobby : String? = nil
    
    init(name newName : String, age newAge : Int){
        name = newName
        age = newAge
    }
    
    //實(shí)例方法里面不能直接調(diào)用類(lèi)屬性
    //實(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修飾的是類(lèi)方法
    //static修飾的類(lèi)方法是不可以被子類(lèi)重寫(xiě)的
    static func sayHobby() {
        self.hobby = "hiking"
        print(self.hobby)
    }
    
    //class修飾的也是類(lèi)方法
    //class修飾的類(lèi)方法可以被子類(lèi)重寫(xiě)
    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 {
    //如果想在子類(lèi)中重寫(xiě)父類(lèi)方法要加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ù)锋叨,在類(lèi)里面會(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è)類(lèi)既有父類(lèi)又遵守了某個(gè)協(xié)議娃磺,那么格式是
//class + 類(lèi)名:父類(lèi),協(xié)議名字     如果有多個(gè)協(xié)議些己,協(xié)議之間用逗號(hào)隔開(kāi)
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è)類(lèi)添加新的方法,但不可以添加新的屬性

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

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

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



extension可以給一個(gè)類(lèi)拓展新的協(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要填寫(xiě)一個(gè)枚舉類(lèi)型的實(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ù)比較相似豆混。(另:拆包是可選類(lèi)型,與閉包不是一回事)

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

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

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

閉包有5種寫(xiě)法

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

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

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

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

//第五種寫(xiě)法 (省略?xún)?nèi)容最多的一種)
newPassValue = { (a , b) in
    a > b ? a : b
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸵鸥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丹皱,更是在濱河造成了極大的恐慌妒穴,老刑警劉巖宋税,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宰翅,居然都是意外死亡弃甥,警方通過(guò)查閱死者的電腦和手機(jī)爽室,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)汁讼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人阔墩,你說(shuō)我怎么就攤上這事嘿架。” “怎么了啸箫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵耸彪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我忘苛,道長(zhǎng)蝉娜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任扎唾,我火速辦了婚禮召川,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胸遇。我一直安慰自己荧呐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布纸镊。 她就那樣靜靜地躺著倍阐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逗威。 梳的紋絲不亂的頭發(fā)上峰搪,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音凯旭,去河邊找鬼概耻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尽纽,可吹牛的內(nèi)容都是我干的咐蚯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼弄贿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼春锋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起差凹,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤期奔,失蹤者是張志新(化名)和其女友劉穎侧馅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體呐萌,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馁痴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肺孤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罗晕。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赠堵,靈堂內(nèi)的尸體忽然破棺而出小渊,到底是詐尸還是另有隱情,我是刑警寧澤茫叭,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布酬屉,位于F島的核電站,受9級(jí)特大地震影響揍愁,放射性物質(zhì)發(fā)生泄漏呐萨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一莽囤、第九天 我趴在偏房一處隱蔽的房頂上張望谬擦。 院中可真熱鬧,春花似錦烁登、人聲如沸怯屉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锨络。三九已至,卻和暖如春狼牺,著一層夾襖步出監(jiān)牢的瞬間羡儿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工是钥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掠归,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓悄泥,卻偏偏與公主長(zhǎng)得像虏冻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弹囚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,815評(píng)論 1 10
  • Swift 介紹 簡(jiǎn)介 Swift 語(yǔ)言由蘋(píng)果公司在 2014 年推出厨相,用來(lái)撰寫(xiě) OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,225評(píng)論 3 25
  • 1、范型范型所解決的問(wèn)題 函數(shù)、方法蛮穿、類(lèi)型:類(lèi)庶骄,結(jié)構(gòu)體,枚舉践磅,元組類(lèi)型单刁,協(xié)議參數(shù),返回值府适,成員函數(shù)參數(shù)羔飞,成員屬性類(lèi)...
    我是小胡胡123閱讀 832評(píng)論 0 1
  • Hello Word 在屏幕上打印“Hello, world”,可以用一行代碼實(shí)現(xiàn): 你不需要為了輸入輸出或者字符...
    restkuan閱讀 3,181評(píng)論 0 6
  • 基礎(chǔ)部分(The Basics) 當(dāng)推斷浮點(diǎn)數(shù)的類(lèi)型時(shí)细溅,Swift 總是會(huì)選擇Double而不是Float褥傍。 結(jié)合...
    gamper閱讀 1,293評(píng)論 0 7