Swift讲解专题十二——方法

Easter79
• 阅读 674

Swift讲解专题十二——方法

一、引言

        方法只是一个术语,其实就是将函数与特定的类型结合,类、结构体、枚举都可以定义方法,方法又分为实例方法和类型方法,类型方法类似于Objective-C中的类方法。Swift和Objective-C的一大不同是,Objective-C只有在类中可以定义方法。

二、实例方法基础

        实例方法的语法和函数完全一致,其和具体类型的实例所关联,实例方法在调用时由类型的实例点语法进行调用来完成一些功能模块。示例如下:

class Math {
    //完成加法功能的实例方法
    func add(param1:Double,param2:Double)->Double{
        return param1+param2
    }
}
//创建类型实例
var obj = Math()
//调用方法进行计算
obj.add(5, param2: 5)

与Objective-C类似,Swift中每一个类的实例中都隐藏含有一个self属性,self属性就是实例本身,开发者可以在实例方法中使用self来调用属性或者其他实例方法,示例如下:

class Math {
    //完成加法功能的实例方法
    func add(param1:Double,param2:Double)->Double{
        return param1+param2
    }
    func mul(param1:Double,param2:Double) -> Double {
        //使用self调用实例方法
        self.add(param1, param2: param2)
        return param1*param2
    }
}

然而,Swift并不要求开发者必须写self,默认情况下,开发者可以直接省略self来调用属性和方法:

class Math {
    //完成加法功能的实例方法
    func add(param1:Double,param2:Double)->Double{
        return param1+param2
    }
    func mul(param1:Double,param2:Double) -> Double {
        //使用self调用实例方法
        add(param1, param2: param2)
        return param1*param2
    }
}

有一种情况需要注意,对于属性的调用,如果方法中的参数名和类实例的属性名相同,则必须使用self来调用类的实例属性,防止歧义的产生:

class Math {
    var param1 = 10.0
    //完成加法功能的实例方法
    func add(param1:Double,param2:Double)->Double{
        //这里将使用param1=10,如果不加self 将使用参数中的param1
        return self.param1+param2
    }
    func mul(param1:Double,param2:Double) -> Double {
        //使用self调用实例方法
        add(param1, param2: param2)
        return param1*param2
    }
}

三、在实例方法中修改值类型的值

        首先需要清楚一个概念,Swift中有两种类型,值类型和引用类型,具体在类、结构体、枚举一节中有相关介绍,这里需要注意的是,对于值类型,即结构体和枚举,其并不能直接在实例方法中修改实例属性的值,Swift中提供了另一种方式,如果真有如此的需求,开发者可以使用mutating关键字将实例方法声明成可变的,实际上,如果在可变的实例方法中修改了值类型属性的值,是会创建一个新的实例来代替原来的实例的,示例如下:

struct Point {
    var x:Double
    var y:Double
    mutating func move(x:Double,y:Double) {
        self.x+=x
        self.y+=y
    }
}
var point = Point(x: 1, y: 1)
print(point)
point.move(3, y: 3)
print(point)

在值类型实例的可变方法中修改属性的值,实际上就是创建了一个新的实例,上面的写法和下面的写法原理是一样的:

struct Point {
    var x:Double
    var y:Double
    mutating func move(x:Double,y:Double) {
        self = Point(x: self.x+x,y: self.y+y)
    }
}

四、类型方法

        正如实例方法是通过类型的实例来进行调用的,类型方法是通过类型直接来调用的,相比于实例方法,类型方法中的self指当前类型,同样开发者可以使用self来区别类型属性和类型方法中的参数。使用Static关键字来进行类型方法的创建:

struct Point {
    var x:Double
    var y:Double
    mutating func move(x:Double,y:Double) {
        self = Point(x: self.x+x,y: self.y+y)
    }
    static func name(){
        print("Point")
    }
}
Point.name()

如果是在类中创建类型方法,若此方法可以被子类进行重写,则应该使用class关键字来创建,示例如下:

class Math {
    var param1 = 10.0
    //完成加法功能的实例方法
    func add(param1:Double,param2:Double)->Double{
        //这里将使用param1=10,如果不加self 将使用参数中的param1
        return self.param1+param2
    }
    func mul(param1:Double,param2:Double) -> Double {
        //使用self调用实例方法
        add(param1, param2: param2)
        return param1*param2
    }
    class func name(){
        print("Math")
    }
}
Math.name()

专注技术,热爱生活,交流技术,也做朋友。

——珲少 QQ群:203317592

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
Swift讲解专题七——函数
Swift讲解专题七——函数一、引言      函数是有特定功能的代码段,函数会有一个特定的名称调用时来使用。Swift提供了十分灵活的方式来创建与调用函数。事实上在Swift,每个函数都是一种类型,这种类型由参数和返回值来决定。Swift和ObjectiveC的一大区别就在于Swift中的函数可以进行嵌套
Easter79 Easter79
3年前
Swift专题讲解十九——类型转换
Swift专题讲解十九——类型转换一、类型检查与转换      在ObjectiveC和Java中,任何类型实例都可以通过强转使编译器认为它是另一种类型的实例,这么做其实是将所有的安全检查工作都交给了开发者自己来做。先比之下,Swift中的Optional类型转换就会比较安全与可靠。      
Easter79 Easter79
3年前
Swift讲解专题九——枚举
Swift讲解专题九——枚举一、引言      在ObjectiveC语言中,没有实际上是整型数据,Swift中的枚举则更加灵活,开发者可以不为其分配值类型把枚举作为独立的类型来使用,也可以为其分配值,可以是字符,字符串,整型或者浮点型数据。二、枚举语法      Swift中enum关
Easter79 Easter79
3年前
Swift解读专题四——字符串与字符
Swift解读专题四——字符串与字符一、引言      Swift中提供了String类型与Characters类型来处理字符串和字符数据,Swift中的String类型除了提供了许多方便开发者使用的方法外,还可以与Foundation框架的NSString类进行转换,使用起来十分方便。二
Easter79 Easter79
3年前
Swift中构造方法的解析
Swift中构造方法的解析一、引言     构造方法是一个类创建对象最先也是必须调用的方法,在ObjectiveC中,开发者更习惯称这类方法为初始化方法。在ObjectiveC中的初始化方法与普通函数相比除了要以init抬头外并无太严格的分界,而在Swift语言体系中,构造方法与普通的方法分界十分严格,从格式
Easter79 Easter79
3年前
Swift专题讲解二十一——协议
Swift专题讲解二十一——协议一、引言      协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议可以通过扩展来实现一些方法和附加功能。
Easter79 Easter79
3年前
Swift讲解专题十三——下标访问
Swift讲解专题十三——下标访问一、引言      在以前的博客中,讨论过在ObjectiveC中,通过下标的方式访问自定义数据模型的方法。ObjectiveC中主要是通过实现一系列方法来使自定义的数据类型支持下标的访问方式,博客地址如下:在ObjectiveC中使用下标访问自定义数据模型:
Easter79 Easter79
3年前
Swift专题讲解二十——扩展
Swift专题讲解二十——扩展一、简介      Swift中的扩展与ObjectiveC中的类别功能相似,扩展可以为一个已有的类、结构体、枚举或者协议添加新的属性或方法,与ObjectiveC的类别不同的是,Swift中的扩展没有名称。      Swift中的扩展支持如下功能:1.添加计
Easter79 Easter79
3年前
Swift专题讲解十四——继承
Swift专题讲解十四——继承一、引言      Swift中,一个类可以从另一个类继承方法、属性、下标及其他特性。当一个类继承于另一个类时,这个类被称为子类,所继承的类被称为父类。在Swift中,继承是类区别于其他类型的主要特征。子类除了可以调用父类的属性,下标,方法外,其也可以对父类的属性,下标,方法进
小万哥 小万哥
7个月前
C++ 类方法解析:内外定义、参数、访问控制与静态方法详解
C类方法类方法,也称为成员函数,是属于类的函数。它们用于操作或查询类数据,并封装在类定义中。类方法可以分为两种类型:类内定义方法:直接在类定义内部声明和定义方法。类外定义方法:在类定义内部声明方法,并在类外部单独定义方法。类内定义方法在类定义内部可以直
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k