QiShare文章汇总Swift专栏

Swift 5.1 (11) - 方法

2020-01-16  本文已影响0人  QiShare

级别: ★☆☆☆☆
标签:「iOS」「Swift 5.1」「实例方法」「类方法」「mutating」
作者: 沐灵洛
审校: QiShare团队


方法

方法是与特定类型相关联的函数。Swift中类,结构体和枚举都可以定义实例方法,这些方法封装了用于处理特定类型实例的特定任务和功能。同时类,结构体和枚举也都可以定义类型方法,与类型本身关联。
Swift中结构体和枚举可以定义方法这是与C和Objective-C的主要区别。

实例方法

实例方法是属于特定的类,结构体或枚举类型的实例的函数。实例方法与函数具有完全相同的语法。实例方法可以隐式访问该类型的所有其他实例方法和属性。实例方法只能在其所属类型的特定实例上调用。

class Counter {
    var count = 0
    func increment() {
        count += 1
    }
    func increment(by amount: Int) {
        count += amount
    }
    func reset() {
        count = 0
    }
}
//调用
let counter = Counter() //!< count : 0
counter.increment()//!<count : 1
counter.increment(by: 5)//!< count : 6
counter.reset()//!< count : 0

self属性
类型的每个实例都有一个self的隐式属性,self与实例本身完全等效。使用self属性在其自己的实例方法中引用当前实例对象。
大多数情况下对于某个特定的类型,我们可以不用在其实例方法中使用self属性去引用该实例的属性或者调用其他方法。因为当我们没有明确使用self引用已知属性或方法时,Swift会自动推断为当前类型的实例。但是当我们的实例方法的参数名称和属性的名称相同时,在方法内部,参数名具有一定的优先权。若是需要使用属性,则需要明确使用self来引用属性,以区分参数。

实例方法中修改值类型
结构和枚举是值类型。默认情况下,无法在其实例方法中修改值类型的属性。
如果需要在特定方法中修改枚举或结构体中定义的属性,使用mutating关键字放在枚举或结构体中所定义方法的func关键字之前,使得该方法可以在方法中修改枚举或结构体的属性,并且当方法结束时,它所做的任何更改都将写回原始数据结构中。该方法还可以为其隐式self属性分配一个全新的实例,并且该self所表示的新实例将在方法结束时替换现有实例。

struct Point {
    var x = 0.0, y = 0.0 //!< 必须变量,常量不能被修改
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("当前点: (\(somePoint.x), \(somePoint.y))")//!< 当前点: (3.0, 4.0)"

类型的mutating方法中给隐式的self属性赋值
值类型:结构体

struct Point {
    var x = 0.0, y = 0.0 //!< 必须变量,常量不能被修改
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        self = Point.init(x: x + deltaX, y: y + deltaY)
    }
}

值类型:枚举类型

enum SizeType:Int,CaseIterable {
    case big,middle,small
    mutating func nextCase() {
        switch self {
        case .big:
            self = .middle
        case .middle:
            self = .small
        case .small:
            self = .big
        }
    }
}
//使用
let sizeType = SizeType.allCases
for var item in sizeType {
    print("当前的item:\(item)")
    item.nextCase()
    print("调用方法后:\(item)")
}

类型方法

类型方法:使用类型本身而不是类型的实例去调用的方法。
类型方法的表示:在func关键字的前面加static关键字;若当前的类型是类类型时,也可以使用class关键字,对类类型使用class关键字时,表示允许子类重写父类的方法实现。

class SomeClass {
//定义
    class func someTypeMethod() {
        //类方法的实现
    }
}
//调用
SomeClass.someTypeMethod()

在类型方法中,隐式的self属性引用的是类型本身而不再是类型的实例。这意味着我们可以使用self属性来消除类属性和类型方法参数之间的歧义。

函数or方法的声明属性@discardableResult

@discardableResult
将此属性应用于函数或方法声明前,表示虽然该函数有返回值,但如果不使用返回值,编译器不应生成警告。

override init() {
    super.init()
    instanceMethod()
}

@discardableResult
func instanceMethod() -> String {
    return "返回值是一个字符串,但是调用处却不会使用,使用声明属性`@discardableResult`避免编译器的警告"
}

返回值是一个字符串,但是调用处却不会使用,使用声明属性@discardableResult避免编译器的警告。

参考资料:
swift 5.1官方编程指南


小编微信:可加并拉入《QiShare技术交流群》。

关注我们的途径有:
QiShare(简书)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公众号)

推荐文章:
Swift 5.1 (10) - 属性
iOS App后台保活
Swift 中使用 CGAffineTransform
iOS 性能监控(一)—— CPU功耗监控
iOS 性能监控(二)—— 主线程卡顿监控
iOS 性能监控(三)—— 方法耗时监控
初识Flutter web
用SwiftUI给视图添加动画
用SwiftUI写一个简单页面
iOS App启动优化(三)—— 自己做一个工具监控App的启动耗时
iOS App启动优化(二)—— 使用“Time Profiler”工具监控App的启动耗时
iOS App启动优化(一)—— 了解App的启动流程
奇舞周刊

上一篇 下一篇

猜你喜欢

热点阅读