详解Swift面向对象编程中的方法(method)

 更新时间:2016年07月01日 18:46:39   作者:珲少  
既然面向对象那就一定会有method,方法和面向过程语言中的function函数并没什么区别,只不过方法在面向对象语言中可以被类来约束作用域,这里我们就来详解Swift面向对象编程中的方法(method)
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()

一、引言

方法只是一个术语,其实就是将函数与特定的类型结合,类、结构体、枚举都可以定义方法,方法又分为实例方法和类型方法,类型方法类似于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关键字来进行类型方法的创建:

如果是在类中创建类型方法,若此方法可以被子类进行重写,则应该使用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()

相关文章

  • swift内存管理指针类型使用实例详解

    swift内存管理指针类型使用实例详解

    这篇文章主要为大家介绍了swift内存管理指针类型使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Swift中排序算法的简单取舍详解

    Swift中排序算法的简单取舍详解

    对于排序算法, 通常简单的, 为大家所熟知的有, 选择排序, 冒泡排序, 快速排序, 当然还有哈希, 桶排序之类的, 本文仅比较最为常见的选择, 冒泡和快排,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-03-03
  • 关于swift的个人小结

    关于swift的个人小结

    本文是个人对于目前学习swift的一些心得的汇总,这里分享给大家,希望大家能够喜欢
    2016-12-12
  • 用SwiftUI实现3D Scroll滚动效果的实现代码

    用SwiftUI实现3D Scroll滚动效果的实现代码

    这篇文章主要介绍了用SwiftUI实现3D Scroll效果的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习
    2020-04-04
  • SwiftUI使用Paths和AnimatableData实现酷炫的颜色切换动画

    SwiftUI使用Paths和AnimatableData实现酷炫的颜色切换动画

    这篇文章主要介绍了SwiftUI使用Paths和AnimatableData实现酷炫的颜色切换动画,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-05-05
  • Swift Extension扩展得使用详细介绍

    Swift Extension扩展得使用详细介绍

    在swift中,extension与Objective-C的category有点类似,但是extension比起category来说更加强大和灵活,它不仅可以扩展某种类型或结构体的方法,同时它还可以与protocol等结合使用,编写出更加灵活和强大的代码
    2022-09-09
  • Swift自定义UITableViewCell背景色

    Swift自定义UITableViewCell背景色

    这篇文章主要为大家详细介绍了Swift自定义UITableViewCell背景色,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 浅谈在Swift中关于函数指针的实现

    浅谈在Swift中关于函数指针的实现

    这篇文章主要介绍了浅谈在Swift中关于函数指针的实现,是作者根据C语言的指针特性在Swifft中做出的一个实验,需要的朋友可以参考下
    2015-07-07
  • Swift中的命名空间详解

    Swift中的命名空间详解

    这篇文章主要给大家介绍了关于Swift中命名空间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 详谈swift内存管理中的引用计数

    详谈swift内存管理中的引用计数

    下面小编就为大家带来一篇详谈swift内存管理中的引用计数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论