1.方法

Swift方法是与某种特定类型相关联的函数
在Swift中可以在类/结构体/枚举中定义方法

①实例方法

实例方法属于某个特定类,结构体或者枚举类型实例的方法
实例方法提供以下方法

  • 可以访问与修改实例属性
  • 提供与示例目的相关的功能
  • 实例方法能够隐式访问他所属类型的所有的其他实例方法与属性
  • 实例方法不能脱离于现实的实力而被调用
  • 实例方法只能被其所属的类的某个特定实例调用

语法

func funcname(Parameters) -> returntype
{
    Statement1
    Statement2
    ……
    Statement N
    return parameters
}

当然可以不需要返回值
实例1(无参数无返回值)

 func increment() {
        count += 1
    }

实例2(带参数)

func incrementBy(amount: Int) {
        count += amount
    }

Swift默认仅给方法的第一个参数名称一个局部参数名称,默认同时给第二个与后续的参数名称为全局参数名称
范例:

  func incrementBy(no1: Int, no2: Int) {
        count = no1 / no2
        print(count)
    }

函数参数中no1在swift中声明为局部参数名称,而no2为全局声明

可以给第一个参数添加外部名称来将这个局部名称当成外部名称使用
也可以用_设置第二个以及后续的参数不提供一个外部名称

在实例方法中修改值类型

Swift中结构体与枚举是值类型,一般情况下,,值类型的属性不能在其实例方法中被修改
但是,如果实在要在某个具体的方法中修改,可以选择mutating方法,就可以从方法内部改变其属性

实例:

struct area {
    var length = 1
    var breadth = 1
    
    func area() -> Int {
        return length * breadth
    }
    
    mutating func scaleBy(res: Int) {
        length *= res
        breadth *= res
        
        print(length)
        print(breadth)
    }
}

通过scaleBy函数可以对结构体中的length与breadth变量进行修改

var val = area(length: 3, breadth: 5)  //实例化
val.scaleBy(res: 3)                    //修改

2.下标脚本

可定义在类,结构体与枚举这些目标中,可以认为是访问对象,集合或者序列的快速方式
语法类似于实例方法与计算属性的混合

对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,索引值的个数可以是多个

  • 下标脚本允许通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问与赋值

定义下标脚本使用subscript关键字
语法:

subscript(index: Int) -> Int {
    get {
        // 用于下标脚本值的声明
    }
    set(newValue) {
        // 执行赋值操作
    }
}

实例:

struct subexample {
    let decrementer: Int
    subscript(index: Int) -> Int {
        return decrementer / index
    }
}

let division = subexample(decrementer: 100)

print("100 除以 9 等于 \(division[9])")
print("100 除以 2 等于 \(division[2])")
print("100 除以 3 等于 \(division[3])")

输出如下

100 除以 9 等于 11
100 除以 2 等于 50
100 除以 3 等于 33

通常下标脚本使用来访问集合,列表或者序列中元素的快捷方式

  • 下标脚本允许任意数量的入参索引
  • 下标脚本的返回值可以是任何类型
  • 下标脚本可以使用变量参数与可变参数
  • 一个类或者结构体可以根据自身需要提供多个下标脚本实现,也就是下标脚本的重载

3.继承

面向对象特性之一
可以理解为一个类获取了另外一个类的方法与属性

①基类

没有继承其他类的类

②子类

指的是在一个已有类的基础上创建一个新的类
一般将超类名写在子类名的后面
语法:

class SomeClass: SomeSuperclass {
    // 类的定义
}

范例:

class Tom : StudDetails
{
    init()
    {
        super.init(stm1: 93, results: 89)
    }
}

该范例中Tom类继承了StudDetails类

重写

子类可以通过继承来的实例方法,类方法,实例属性或者下标脚本来实现自己的定制功能
可以使用super前缀来访问超类的方法

访问超类的方法、属性以及下标脚本可以通过super前缀来访问超类的方法

重写访问方法
方法super.somemethod()
属性super.someProperty()
下标脚本super[someIndex]

范例:子类从基类中继承并重写方法

class SuperClass {
    func show() {
        print("这是超类 SuperClass")
    }
}

class SubClass: SuperClass  {
    override func show() {
        print("这是子类 SubClass")
    }
}

防止重写

可以使用final关键字防止重写
这样子类在重写了final方法,属性或者下标脚本后在编译时会报错
final var radius = 12.5

4.可选链

可选链是一种可以请求与调用属性,方法与脚本的过程

  • 如果目标有值,调用就会成功并返回值
  • 如果目标为nil,调用将返回nil
12
可选链"?"感叹号!强制展开方法,属性,下标脚本可选链
? 放置于可选值后来调用方法,属性,下标脚本! 放置于可选值后来调用方法,属性,下标脚本来强制展开值`
当可选为 nil 输出比较友好的错误信息当可选为 nil 时强制展开执行错误

实例(来自菜鸟教程):

class Person {
    var residence: Residence?
}

class Residence {
    var numberOfRooms = 1
}

let john = Person()

//将导致运行时错误
let roomCount = john.residence!.numberOfRooms

因为此时没有可以供解析的residence

可以用以下代码代替上面最后一行代码

if let roomCount = john.residence?.numberOfRooms {
    print("John 的房间号为 \(roomCount)。")
} else {
    print("不能查看房间号")
}

更多相关内容请点击该链接 可选链

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议