Swift函数闭包属性(二)

1. 函数与闭包, 利用func来声明一个函数, 通过 -> 指定函数返回值的类型. 定义含有参数的函数必须指定参数的类型. 默认情况下, 函数使用它们的形式参数作为实际参数的标签, 在形参前面可以定义实际参数标签, 或者使用_避免使用实际参数标签. 函数可以通过元组的方式返回多个值. 元组可以通过下划线方式访问value.0, 也可以通过标签的形式访问: value.double1

func someFunction(firstValue: Int, secondValue: String) -> Int {

}    //调用: someFunction(firstValue: 3, secondValue: "123")

func secondFunction(_ firstValue: Int, secondValue: String) -> Int {

}    //调用: secondFunction(3, secondValue: "123")

func thirdFunction() -> (double1: Int, double2: Int) {

}    //调用 let value = thirdFunction(). 

2. 定义一个参数可变的函数, 使用...表示参数个数可变, 在函数主体内部, 可变参数变成一个数组. 一个函数可以有任意个非可变参数, 但只有列表最后一个参数可以是可变参数

func testFunction(numbers: Int...) -> {

        var total = 0;    for num in numbers { total += num};    return total;

} 调用: let a = testFunction(numbers: 1, 2, 3, 4)

3. 通常函数以参数为输入时是值传递, 使用inout关键字可以引用传递改参数, 直接改变这个变量中的存储值.

func swapValues (firstValue: inout Int, secondValue: inout Int) {

        let tmp = firstValue;        firstValue = secondValue;        secondValue = tmp;

}    //调用: var swap1 = 123; var swap2 = 456; swap(&swap1, &swap2);

4. 函数可以用作变量, 可以声明一个变量, 能够存储特定参数和返回值类型, 只要一个函数的

参数和返回值类型都与变量一直, 即可将函数存储到这个变量中. 这个变量可以作为其他函数的参数, 也可以作为其他函数的返回值.

func createIncrementor(inCrementAmount: Int) -> () -> Int {

        var amout = 0

        func incrementor() -> Int {    

                amount += inCrementAmount; return amount;

        }

        return incrementor;

}

5. 闭包, 闭包其实就是一些小的匿名代码块, 可以像函数一样使用. 可以使用{}括起一个没有名字的闭包, 闭包使用in来分隔实际参数和返回类型. 如果闭包只包含一行代码可以省略return, 如果闭包是函数的唯一参数, 可以去掉圆括号直接写闭包

let numbers = [5, 1, 4, 3]

let array = numbers.sorted(by: {(n1, n2) -> Bool in

        return n2 > n1

})

let array2 = numbers.sorted(by:{

        $1 > $0

})

6. 闭包可以和函数一样存储在变量中, 存储以后可以像调用函数一样调用他们.

var comparator = {(a: Int, b: Int) -> Bool in return a < b}

comparator(1, 2);    //true

7. 对象和类, Swift中通过class后接类名称创建一个类.  类中可以包含属性和方法, 属性和方法是类的组成部分, 属性是变量, 方法是函数. self是引用当前运行该代码的对象, 使用init(初始化器)可以创建初始化信息. 使用deinit(反初始化器)可以在释放对象之前做一些清理工作.

class Vehicle {

        var color: String?;  var maxSpeed = 80

        init(color: String){    self.color = color;    }

        func descrption() -> String {   return "A \(self.color) vehicle"    }

}

定义实例: var  redVehicle = Vehicle();  

redVehicle.color = "Red";     redVehicle.descrption ()

8. 继承, 一个类可以继承另外一个类, 当一个类继承另外一个类的时候, 他会包含这个父类的的函数和属性, 在Swift中一个类只能有一个父类, 继承可以重写函数, 重写函数前面必须加override关键字, 否则编译器会报错. 如果在重写的函数中调用父类的版本, 可以使用super关键字.

Class Car : Vehicle {

        override func description -> String {      

                        var description = super.description();

                        retrun description + "is a car"

        }

}

9. 初始化和反初始化, 在Swift中创建对象时, 会调用一个被称为初始化器的特殊方法, 初始化器用来为对象设定初始状态的方法. 除了初始化器还有一个反初始化器, 对象从内存中清除时调用. 就是在对象消失之前做一些清理工作.

class InitAndDeinitExample {

        init() {  println("I have been created!")  }    //主初始化器

        convenience init(text: String) {                    //便携式初始化器

                self.init();                                                //调用上述主初始化器必须的

                println("I was called with the convenience initializer!")

        }

        deinit {                                                            //反初始化器

                println("I have going away!")

        }

}

10. 初始化器可以返回nil, 当初始化器不能成功构造一个函数时, 会返回nil, 例如: NSURL, 当接受一个无效的字符串时, 返回nil. 要创建一个可以返回nil的初始化器, 就在init后面放上一个问号, 并在初始化器不能成功构造对象时, 返回nil. 一个可以失败的初始化器, 任何可以在其中存储结构的变量都是可选的.

convenience init?(value: Int) {

        self.init();    if value > 5 {    return nil;    //表示初始化失败    }

}

11. 属性, 属性就是变量或常量, 附着到类的实例中, 类将数据存储到实例中. 属性分为存储属性和计算属性. 存储属性: 属性是存储在对象中一个简单的值.  计算属性: 利用代码计算他们的取值. 计算属性的定义, 可以像声明储存属性一样声明一个变量, 然后在后面增加大括号, 在大括号内提供get部分, 还可视需要提供一个set部分. 

classRectangle {

        var width: Double = 0.0;        var height: Double = 0.0;

        var area: Double {

                    get {    return width * height    }

                    set {    width = sqrt(newValue);    height = sqrt(newValue);    }

         }

}

12. 属性观察器, 在属性发生变化时可以运行某些代码. 可以像属性添加属性观察器. 创建属性观察器方式: 需要在属性后面添加大括号, 并包含willSet(属性发生变化之前被调用)和didSet(属性发生变化之后被调用)代码块.

class PropertyObserverExample {

        var number: Int = 0 {

               wilSet(newNumber) {    println("will change to \(newNumber)")    }

                didSet(newNumber) {    println("did change to \(newNumber)")  }

        }

}

13. 可以将属性设成惰性的, 惰性属性就是首次访问才会设定的属性. 类的某些设置工作需要耗费大量的时间, 利用惰性属性可以将工作推迟到需要的时完成, 将一个属性设置成惰性属性, 只需要在其前面加上lazy关键字.

class SomeClass1 {

        init(id: Int) {    println("SomeClass1 created: \(id)")    }

}

class SomeClass2 {

        var varClass1 = SomeClass1(id: 1)

        lazy var varClass2 = SomeClass1(id: 2) 

       init() {    println("first created!")    }

}

var varClass2 = SomeClass2();    //输出: SomeClass1 created: 1  first created!

varClass2.varClass1                      //不输出任何内容, 因为已经创建

varClass2.varClass2                     //输出: SomeClass1 created: 2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容