Swift学习笔记02

函数

独立的能够重复使用的功能模块.对于调用者来说,函数就像是一个独立的黑盒子,调用者在使用函数提供的功能时并不需要了解它的内部实现。Swift支持全局函数和方法,方法是跟类或者某种类型的对象相关联的函数
定义一个函数:

func sayHello(personName: String, alreadyGreeted: Bool)  -> String {
    if alreadyGreeted {
        return "怎么又是你," + personName + "!"
    }
    let greeting = "hello, " + personName + "!"
    //如果函数的返回类型不是void 那么函数中一定有return语句
    return greeting
}

调用函数:
调用函数,函数名(参数值)
如果有两个以上的参数,第二个开始需要写上参数名
如果想省略外部参数名 在构建函数的时候 可以加上 _ 表示省略外部参数名

print(sayHello("王大锤", alreadyGreeted: true))
print(sayHello("JACK", alreadyGreeted: false))

Swift中,函数的参数可以是inout参数,所谓inout参数是指可以在函数中被修改并影响到调用者的参数

func swap(inout x: Int, inout _ y: Int) -> Void {
    //(x, y) = (y, x)
    let temp = x
    x = y
    y = temp
}```
这个交换值的函数,使用Inout参数之后,函数外的X,Y也相应的改变了值
##字典
字典(存放键值对组合的容器) 字典中的每个元素都是由两部分构成的, 冒号前面是键冒号后面是值
创建一个字典:
```swift
var dict: [String: String] = ["abacus": "算盘", "abnormal": "异常的", "hello" : "你好", "good": "好的"]

遍历字典

//遍历字典中所有的值
for value in dict.values {
    print(value)
}

//遍历字典中所有的键
for key in dict.keys {
    print("\(key) ----> \(dict[key])")
}

//直接通过一个元组获得字典中的键和值
for (key, value) in dict {
    print("\(key) ----> \(value)")
    
}

闭包

在swift中函数是一种类型,这也就意味着函数可以作为变量或者常量的类型,同理函数也可以作为另一个函数的参数或者返回值

func foo(array: [Int], fn: (Int, Int) -> Int) -> Int {
    var sum = 0
    for x in array {
        sum = fn(sum, x)
    }
    return sum
}
print(foo(a, fn: { (a, b) -> Int in
    return a % b
}))

//省略掉类型和不必要的括号
print(foo(a, fn: {a, b in a + b}))
// 省略参数名
print(foo(a, fn: {$0 + $1}))
// 尾随闭包
print(foo(a) {(a, b) -> Int in
    return a + b
    })
print(foo(a) {$0 + $1})

如果函数的最后一个参数是闭包可以写成尾随闭包的形式;将闭包放到函数参数的圆括号外面写在一对花括号中;如果函数后面有尾随闭包且函数的圆括号中没有参数,那么函数的圆括号可以省略;闭包的返回类型可以省略掉,如果只执行一句代码,return也可以省略掉。

面向对象的思想(类)

对象是接受消息的单元
对象都有属性和行为(静态和动态)
对象都属于一个类
每个对象都是独一无二的
类:对象的蓝图和模板类是抽象的,对象是具体的
消息:对象之间通信的方式,通过对象互发消息可以构造出复杂的系统
首先我们定义一个学生的类

class Student {
    //数据抽象 - 找到和学生相关的属性
    var name: String
    var age: Int
    
    //初始化方法 (构造方法/构造器) - constructor
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    //行为抽象 - 找到和学生相关的方法
    func eat(foodName: String) -> Void {
     print("\(name)正在吃\(foodName)")
    }
    
    func study(courseName: String) {
        print("\(name)正在学习\(courseName)")
    }

}

创建对象,调用初始化方法.然后给对象发消息

let stu1 = Student(name: "北林木笔", age: 18)
stu1.eat("酸辣粉")
stu1.study("高等数学")

名为Student的类中,有name和age两个属性,分别代表人的姓名和年龄;然后定义了两个方法,分别代表了人吃饭和学习的行为。除此之外,在Student类中还有一个init方法,它是类的初始化方法,当类创建一个对象时,需要使用init方法进行对象属性的初始化.如果对象没有属性,也可以不用init方法

类的继承

继承:从已有的类创建新类的过程
提供继承信息的称为父类(超类/基类)
得到继承信息的 称为子类(派生类/衍生类)
通常子类除了得到父类的继承信息还会增加一些自己特有的东西
所以子类的能力一定比父类更强大
继承的意义在于子类可以复用父类的代码并且增强系统现有的功能
我们先创建一个父类,人这个类

//性别的枚举
enum Gender {
    case Male
    case Female
}
class Person {
    var name: String
    var age: Int
    var gender: Gender

    init(name:String, age:Int, gender:Gender){
        self.name = name
        self.age = age
        self.gender = gender
    }
    
    func eat() {
        print("\(name)正在吃饭.")
    }

}

人这个类属性有年龄,名字,性别.行为有吃东西然后我们再创造一个学生类

class Student: Person {
  
    var major: String
    

    init(name:String, age:Int, major:String, gender:Gender){
        self.major = major
        super.init(name: name, age: age, gender: gender)
    }
    
    func study(courseName: String) {
        print("\(name)是\(major)专业的学生")
        print("\(gender == Gender.Male ? "他" : "她") 正在学习\(courseName)")
    }
    
}

学生类继承于人类,所有他的对象也拥有人类对象的属性.而且学生类相对于人类来说又有新的属性(主修课程)和方法(学习).这就是子类对父类的扩展。显然子类拥有比父类更多的能力,也就是说,继承一定是让子类扩展父类的能力而绝不会缩小父类的能力

多态

多态简单的说是同样的方法执行了不同的行为,就好比猫和狗都有发出叫声的行为,但是发出的声音是完全不一样的。
例如我们先建一个宠物的类

enum Gender {
    case Male
    case Female
}
class Pet {
    var nickname: String
    var gender: Gender
    var age: Int
    init(nickname:String, gender: Gender, age: Int){
        self.nickname = nickname
        self.gender = gender
        self.age = age
    }

    func shout(){
        print("\(nickname)正在叫")
    }
}```
再建两个宠物类的子类
```swift
class Cat: Pet {
    var hairColor: String
    init(nickname: String, gender: Gender, age: Int, hairColor:String) {
        self.hairColor = hairColor
        super.init(nickname: nickname, gender: gender, age: age)
    }
    
    override func shout(){
        print("\(nickname):喵喵喵喵.....")
    }

}
class Dog: Pet {
    var isLarge: Bool
    
    init(nickname: String, gender: Gender, age: Int, isLarge:Bool) {
    self.isLarge = isLarge
    super.init(nickname: nickname, gender: gender, age: age)
    }

    override func shout() {
        print("\(nickname): 汪汪汪....")
    }

}

父类中宠物已经有了shout的这个方法,但是由于猫和狗实现的方法不一样.所以我们要重写父类的方法,需要在方法前添加override关键字
重写有时也被称为置换、覆盖、覆写
然后我们创建猫和狗的对象来调用这个方法

let petsArray = [
    Cat(nickname: "加菲", gender: .Female, age: 2, hairColor: "黄色"),
    Dog(nickname: "大黄", gender: .Male, age: 1, isLarge: true),
]
for pet in petsArray {
    pet.shout()//加菲:喵喵喵喵..... 大黄: 汪汪汪....
}

同样的对象类型(pet)接受相同的消息(调用相同的方法)但是做了不同的事情。

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

推荐阅读更多精彩内容