swift簡單總結(jié)(四)—— 函數(shù)和類

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.07.18

前言

我是swift2.0的時(shí)候開始接觸的乌助,記得那時(shí)候還不是很穩(wěn)定陌知,公司的項(xiàng)目也都是用oc做的,并不對(duì)swift很重視仆葡,我自己學(xué)了一段時(shí)間沿盅,到現(xiàn)在swift3.0+已經(jīng)出來了,自己平時(shí)也不寫腰涧,忘記的也差不多了南窗,正好項(xiàng)目這段時(shí)間已經(jīng)上線了郎楼,不是很忙窒悔,我就可以每天總結(jié)一點(diǎn)了,希望對(duì)自己對(duì)大家有所幫助阶界。在總結(jié)的時(shí)候我會(huì)對(duì)比oc進(jìn)行說明聋庵,有代碼的我會(huì)給出相關(guān)比對(duì)代碼。
1. swift簡單總結(jié)(一)—— 數(shù)據(jù)簡單值和類型轉(zhuǎn)換
2. swift簡單總結(jié)(二)—— 簡單值和控制流
3. swift簡單總結(jié)(三)—— 循環(huán)控制和函數(shù)

函數(shù)

1. 函數(shù)作為參數(shù)傳入另一個(gè)函數(shù)

前面在講函數(shù)的時(shí)候氧映,我們看到函數(shù)是可以嵌套的脱货,還可以作為返回值返回振峻,這里我們講另外一種情況,那就是函數(shù)作為參數(shù)進(jìn)行傳遞扣孟,也就是說凤价,函數(shù)的參數(shù)是另外一個(gè)參數(shù)。

下面我們就看一下 swift中的代碼。

    override func viewDidLoad()
    {
        super.viewDidLoad()
   
        view.backgroundColor = UIColor.lightGray

        //函數(shù)作為參數(shù)進(jìn)行傳遞
        let numbers = [20, 15, 18, 9]
        let matchCondition = match(list: numbers, condition: lessThan)
        print(matchCondition)
    }

    //函數(shù)作為參數(shù)進(jìn)行傳遞
    func match(list : [Int], condition:(Int) -> Bool) -> Bool {
        for item in list {
            if condition(item) {
                return true
            }
        }
        return false;
    }
    
    func lessThan(number : Int) -> Bool {
        return number < 18
    }

2. 函數(shù)的本質(zhì)

函數(shù)的本質(zhì)其實(shí)就是一種特殊的閉包立轧,可以使用{}來創(chuàng)建一個(gè)匿名閉包躏吊,使用in將參數(shù)和返回值類型聲明與閉包函數(shù)體進(jìn)行分離。

    //函數(shù)實(shí)質(zhì)上就是閉包
    numbers.map({
    (number : Int) -> Int in
        let result = number * 3
        return result
    })

如果一個(gè)閉包的類型已知胜卤,比如作為一個(gè)回調(diào)函數(shù)赁项,你可以忽略參數(shù)的類型和返回值,單個(gè)語句閉包會(huì)把它語句的值單做結(jié)果返回舰攒。


let  mappedNumbers =  numbers.map({number in 3 * number})

可以通過參數(shù)位置而不是參數(shù)名字來引用參數(shù)摩窃,這個(gè)方法在非常短的閉包中非常有用,當(dāng)一個(gè)閉包作為最后一個(gè)參數(shù)傳給一個(gè)函數(shù)的時(shí)候猾愿,它可以直接跟在括號(hào)后面蒂秘。

let sortNumbers = sorted(numbers) {$0 > $1}


1. 類的創(chuàng)建

使用class和類名創(chuàng)建一個(gè)類,類中屬性的聲明和常量观挎、變量聲明一樣段化,唯一的區(qū)別是它們的上下文是類,同樣雄嚣,方法和函數(shù)聲明也一樣喘蟆。

下面看一下代碼

class name{
    var number = 0
    
    func myname() -> String {
       return "John"
    }
}

要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,在類名后面加上括號(hào)港谊,使用點(diǎn)語法來訪問實(shí)例的屬性和方法橙弱。

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray

        //類實(shí)例化
        var nameInstance = name()
        nameInstance.number = 10
        var nameFunc = nameInstance.myname()
        print(nameFunc)
    }
}

下面我們就直接看輸出

John

2. 構(gòu)造器

一個(gè)構(gòu)造函數(shù)來初始化實(shí)例棘脐,使用init來創(chuàng)建一個(gè)構(gòu)造器。

下面看代碼顷链。

class NamedShape{
    var numberOfSlides : Int = 0
    var name : String
    
    init(name : String) {
        self.name = name
    }
    
    func simpleDescription() -> String {
        return "A shape with \(numberOfSlides) sides."
    }
}

這里self被用來區(qū)別實(shí)例變量屈梁,當(dāng)你創(chuàng)建實(shí)例的時(shí)候,像傳入?yún)?shù)一樣給類傳入構(gòu)造器參數(shù)潭苞,每個(gè)屬性都需要賦值——無論是通過聲明(就像numberOfSlides)或者是通過構(gòu)造器(就像name)此疹。

如果你需要在刪除對(duì)象之前進(jìn)行一些清理工作,使用deinit創(chuàng)建一個(gè)析構(gòu)函數(shù)湖笨。

3. 子類的定義

子類的定義就是在其類名后面加上父類的名字蹦骑,用冒號(hào)分割,創(chuàng)建類的時(shí)候并不需要一個(gè)標(biāo)準(zhǔn)的根類边败,所以可以忽略父類捎废。

我們先看一下swift中是如何定義子類的,看代碼排截。

class JJSwiftVC: UIViewController
{

}

上面就是定義了一個(gè)子類JJSwiftVC辐益,再比如

class name{
    var number = 0
    
    func myname() -> String {
       return "John"
    }
}

這個(gè)類就沒有指定父類智政。

那么我們?cè)诳匆幌?code>oc中子類的定義,看代碼续捂。

#import <UIKit/UIKit.h>

@interface JJOCVC : UIViewController

@end

我們可以得到如下結(jié)論:

  • oc和swift子類和父類之間都是以冒號(hào)隔開疾忍。
  • oc中繼承父類是寫在.h文件中床三,swift則不分文件。
  • oc在新建文件的時(shí)候就要指定父類聂渊,且不能省略,swift可以不知道根類欲逃。

4.子類重寫父類的方法

swiftoc一樣饼暑,子類可以重寫父類的方法,swift中子類要重寫父類的方法彰居,需要用override標(biāo)記撰筷,沒有這個(gè)標(biāo)志就重寫父類方法會(huì)報(bào)錯(cuò)毕籽,下面我們就看一下代碼。

class NamedShape
{
    var numberOfSlides : Int = 0
    var name : String
    
    init(name : String) {
        self.name = name
    }
    
    func simpleDescription() -> String {
        return "A shape with \(numberOfSlides) sides."
    }

}

class Square : NamedShape
{

    override func simpleDescription() -> String {
        return "子類在重寫父類方法"
    }
}

下面我們看一下oc中是如何重寫父類方法的溶握。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    self.imageArr = [self loadGifImageArr];
    
    [self setupUI];
}

這就是典型的重寫父類的方法奈虾,不用任何標(biāo)志廉赔,直接在子類里實(shí)現(xiàn)父類的方法就是相當(dāng)于重寫父類的方法了。

5. 屬性的getter&setter方法

下面我們看一下swift中的settergetter方法碉纳,看代碼馏艾。

class JJSwiftVC: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
 
                let triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
        print(triangle.permeter)
        triangle.permeter = 9.9
        print(triangle.sideLength)
    }
}

class EquilateralTriangle : NamedShape
{
    var sideLength : Double = 0.0
    
    init(sideLength : Double, name : String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSlides = 3
    }
    
    var permeter : Double{
        get {
        
            return 3.0 * sideLength
        }
        set{
        
            sideLength = newValue / 3.0
        }
    }
    
    override func simpleDescription() -> String {
        return "An equilateral Triangle with sides of lenght \(sideLength)"
    }

}

下面我們看結(jié)果輸出琅摩。

9.3
3.3

上面的不難理解,getter方法是3.0 * sideLength蜕劝,3.1 * 3 = 9.3,后面的setter方法是新值9.9 / 3 = 3.3暑始。

這里婴削,類EquilateralTriangle的構(gòu)造器,需要執(zhí)行三步:

  • 設(shè)置子類聲明的屬性值
  • 調(diào)用父類的構(gòu)造器
  • 改變父類定義的屬性值嗤朴,其他的工作比如調(diào)用方法互躬,getter和setter也可以在這個(gè)階段完成吼渡。

如果不需要計(jì)算屬性,但是仍然需要在設(shè)置一個(gè)新值之前或者之后運(yùn)行代碼坎背〖娜福可以使用willSetdidSet

下面我們看一下代碼懂更。

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray

        let triangleAndSqure = TriangleAndSquare(size : 10, name : "another test shape")
        print(triangleAndSqure.square.sideLength)
        print(triangleAndSqure.triangle.sideLength)
        triangleAndSqure.square = Square(sideLength: 50, name: "larger square")
    }
}

class TriangleAndSquare
{
    var triangle : EquilateralTriangle{
        willSet {
        
            square.sideLength = newValue.sideLength
        }
    
    }
    
    var square : Square{
        willSet {
            
            triangle.sideLength = newValue.sideLength
        }
    }
    
    init(size : Double, name : String) {
        square = Square(sideLength : size, name : name)
        triangle = EquilateralTriangle(sideLength: size, name: name)
    }
}

上面的就是swift中的getter和setter方法沮协,不知道大家是否記得oc中的getter和setter方法卓嫂。

  • oc中的getter方法用點(diǎn)語法就可以點(diǎn)出來。
  • oc中的setter方法也可以使用點(diǎn)語法進(jìn)行賦值行瑞。
  • oc中的getter和setter方法都可以重寫餐禁。

6. 類中的方法和函數(shù)

類中的方法和函數(shù)有一個(gè)重要的區(qū)別帮非,函數(shù)的參數(shù)名只能在函數(shù)內(nèi)部使用绷旗,但是方法的參數(shù)名需要在調(diào)用的時(shí)候顯示說明(除了第一個(gè)參數(shù))副砍,默認(rèn)情況下豁翎,方法的參數(shù)名和它在方法內(nèi)部的名字一樣隅忿,不過你可以定義第二個(gè)名字滨巴,這個(gè)名字被用在方法內(nèi)部庸娱,下面看代碼畦娄。

class JJSwiftVC: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        var counter = Counter()
        counter.incrementBy(2, numberOfTimes: 7)
        
    }
}

class Counter
{
    var count : Int = 0
    func incrementBy(amount : Int, numberOfTimes times : Int){
        count += amount * times
        print(count)
    }
}

下面看輸出結(jié)果

14

這里可見:

  • 這里times就是給numberOfTimes起的別名熙卡。

還需要說明的是励饵,在操作可選值的時(shí)候役听,在操作之前加上?,如果?之前是nil甜滨,?后面的東西都會(huì)被忽略熙参,并且整個(gè)表達(dá)式會(huì)返回nil,否則昭娩,?之后的東西都會(huì)被運(yùn)行黍匾,在這兩種情況下锐涯,整個(gè)表達(dá)式的值是一個(gè)可選值。

下面我們看一下代碼霎终。

let optionalSquare : Square? = Square(sideLength : 2.5, name : "optional square")

let sideLength = optionalSquare. sideLength

后記

已經(jīng)很晚了,今天就寫這么多吧击困,未完广凸,待續(xù)~~~

sea
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谅海,一起剝皮案震驚了整個(gè)濱河市扭吁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谅摄,老刑警劉巖系馆,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件由蘑,死亡現(xiàn)場離奇詭異,居然都是意外死亡尼酿,警方通過查閱死者的電腦和手機(jī)裳擎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門鹿响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妈倔,你說我怎么就攤上這事绸贡∫慊” “怎么了虑绵?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵闽烙,是天一觀的道長鸣峭。 經(jīng)常有香客問我酥艳,道長,這世上最難降的妖魔是什么莫换? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任拉岁,我火速辦了婚禮惰爬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陵叽。我一直安慰自己丛版,他們只是感情好页畦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著独令,像睡著了一般好芭。 火紅的嫁衣襯著肌膚如雪栓撞。 梳的紋絲不亂的頭發(fā)上碗硬,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天恩尾,我揣著相機(jī)與錄音挽懦,去河邊找鬼。 笑死冀偶,一個(gè)胖子當(dāng)著我的面吹牛渔嚷,可吹牛的內(nèi)容都是我干的形病。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼量瓜,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼途乃!你這毒婦竟也來了耍共?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤枫弟,失蹤者是張志新(化名)和其女友劉穎淡诗,沒想到半個(gè)月后伊履,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡群凶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年请梢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毅弧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寸宵,死狀恐怖元咙,靈堂內(nèi)的尸體忽然破棺而出庶香,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布倘零,位于F島的核電站戳寸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏袖瞻。R本人自食惡果不足惜拆吆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一枣耀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牺堰,春花似錦颅围、人聲如沸院促。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掌猛。三九已至,卻和暖如春废膘,著一層夾襖步出監(jiān)牢的瞬間慕蔚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工灌闺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桂对,地道東北人鸠匀。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓缀棍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親父腕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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