Swift2.0语言教程之类的方法

Swift2.0语言的方法

方法其实就是函数,只不过它被定义在了类中。在Swift中,根据被使用的方式不同,方法分为了实例方法和类型方法两种。这两种方法的定义也和Objective-C是不同的。本节依次讲解这两种方法。

Swift2.0语言的实例方法

实例方法被定义在类中,但是由类的实例调用。所以,这类方法被称为实例方法。实例方法和函数一样,分为了不带参数和带参数两种。以下依次讲解这两种方法的使用。

1.不带参数的实例方法

不带参数的实例方法定义和函数的是一样的,其语法形式如下:

  • func 方法名()->返回值类型{

  • }

但它的调用形式和函数的有所不同,其调用形式如下:

  • 对象名.方法名()

其中,对象名必须代表的是方法所属类的实例。

【示例8-13】以下将使用方法输出字符串"Hello"。代码如下:

  • import Foundation

  • class NewClass{

  • var str="Hello"

  • //方法

  • func printHello(){

  • print(str)

  • }

  • }

  • let newClass=NewClass()

  • newClass.printHello()

运行结果如下所示:

  • Hello

2.具有参数的实例方法

具有参数的实例方法就是在方法名后面的括号中添加了参数列表。它的定义也和函数一样,定义形式如下:

  • func 方法名(参数1:数据类型,参数2:数据类型,…)->返回值类型{

  • }

它的调用形式如下:

  • 对象名.方法名(参数1,参数2,…)

下面依次讲解分别具有一个参数和具有多个参数实例方法的使用方式。

(1)具有一个参数的实例方法

具有一个参数的实例方法是指在参数列表中只有一个参数以及类型。

【示例8-14】下面定义一个类Counter。其中包含了increment()、incrementBy()、reset()方法。代码如下:

  • import Foundation

  • class Counter {

  • var count = 0

  • //让count加1

  • func increment() {

  • count++

  • print(count)

  • }

  • //让count加一个指定的数值

  • func incrementBy(amount: Int) {

  • count += amount

  • print(count)

  • }

  • //将count设置为0

  • func reset() {

  • count = 0

  • print(count)

  • }

  • }

  • let counter = Counter()

  • //加1

  • counter.increment()

  • counter.increment()

  • counter.increment()

  • //加指定的值

  • counter.incrementBy(10)

  • //设置为0

  • counter.reset()

其中,increment()方法的功能是自动加1,在每调用一次此方法时,都会在原来值的基础上增加1;incrementBy()方法是将当前的值和指定的数相加。运行结果如下所示:

  • //加1的结果

  • 1

  • 2

  • 3

  • //加10的结果

  • 13

  • //重新进行设置后的结果

  • 0

(2)具有多个参数的实例方法

当实例方法的参数列表中包含多个参数时,参数和参数之间需要使用“,”逗号分隔。

【示例8-15】以下将实现两个数和的计算。代码如下:

  • import Foundation

  • class AddClass {

  • var count:Int=0

  • //计算两个数的和

  • func add(amount1:Int,amount2:Int){

  • count=amount1+amount2

  • print(count)

  • }

  • }

  • let counter = AddClass()

  • counter.add(5,amount2: 10)

其中,方法add()包含两个参数amount1和amount2。调用的时候,分别赋值为5和10。运行结果如下所示:

  • 15

注意:1.当方法具有两个或者两个以上的参数时,Swift默认仅给方法的第一个参数名称一个局部参数名称;默认同时给第二个和后续的参数名称一个局部参数名称和外部参数名称,其中局部参数名称和外部参数名称的名称都是一样的。如果在调用时,第二个参数以及后续的参数不使用外部参数名,程序就会出现错误。如下,

  • import Foundation

  • class AddClass {

  • var count:Int=0

  • //计算两个数的和

  • func add(amount1:Int,amount2:Int){

  • count=amount1+amount2

  • print(count)

  • }

  • }

  • let counter = AddClass()

  • counter.add(5,10)

在此代码中,实例方法在调用时第二个参数没有使用外部参数名,导致程序出现如下的错误:

  • Missing argument label 'amount2:' in call

2.如果开发者不想为方法的第二个及后续的参数提供外部名称,可以通过使用“_” 下划线作为该参数的显式外部名称,这样做将覆盖默认行为。

【示例8-16】以下将实现两个数相乘的结果。代码如下:

  • import Foundation

  • class MultiplyClass {

  • var count:Int=0

  • func multiply(amount1:Int, _ amount2:Int){

  • count=amount1*amount2

  • print(count)

  • }

  • }

  • let counter = MultiplyClass()

  • counter.multiply(5, 10)

在定义时,第二个参数前加上了“_”下划线。所以调用的时候,第二个参数可以省略外部参数名。运行结果如下所示:

  • 50

3.对于实例方法的对象,都必须是通过实例去调用的,它不可以和函数的调用方法一样去调用,如以下的代码,此代码实现的功能是在类中定义一个输出字符串的方法,然后去调用,代码如下:

  • import Foundation

  • class NewClass {

  • func printHello(){

  • print("Hello")

  • }

  • }

  • printHello()

错误信息如下:

  • Use of unresolved identifier 'printHello'

Swift2.0语言的类型方法

实例方法是被类的某个实例调用的方法。开发者还可以定义类自身调用的方法,这种方法被称为类型方法(因为类被认为是一种类型。所以,属于类的方法,被称为类型方法)。定义类型方法需要在func关键字之前加上关键字class,其一般定义形式如下:

  • class 类名 {

  • class func 方法名(参数1:数据类型, 参数1:数据类型,…) {

  • }

  • }

在定义好类型方法后,就可以进行调用了,其调用的一般形式如下:

  • 类名.方法名(参数1,参数2,…)

注意:这里的方法名为类型方法名。

1.不带参数列表的类型方法

不带参数列表的类型方法就是方法名后面的参数列表中没有参数。以下定义了一个输出字符串"Hello"中字符的类型方法。代码如下:

  • import Foundation

  • class NewClass {

  • class var str:String{

  • return "Hello"

  • }

  • //类型方法

  • class func printHello(){

  • for index in str.characters {

  • print(index)

  • }

  • }

  • }

  • NewClass.printHello()

运行结果如下所示:

  • H

  • e

  • l

  • l

  • o

2.具有参数的类型方法

具有参数的类型方法是具有参数列表方法。随着参数的不同,可以将具有参数的类型方法分为具有一个参数的类型方法和具有多个参数的类型方法。以下就是具有一个参数的类型方法,该方法实现输出任意字符串的字符。代码如下:

  • import Foundation

  • class NewClass {

  • class func printString(str:String){

  • for index in str.characters{

  • print(index)

  • }

  • }

  • }

  • NewClass.printString("Swift")

运行结果如下所示:

  • S

  • w

  • i

  • f

  • t

具有多个参数的类型方法说明在参数列表中有多个参数以及类型,参数和参数之间要使用“,”逗号分隔。以下就是定义了多个参数的类型方法,此方法实现了字符串和字符串的连接功能。代码如下:

  • import Foundation

  • class NewClass {

  • //具有多个参数的类型方法

  • class func joinerString(string:String,toString:String,withjoiner:String){

  • print("str1、str2、str3实现关联为:\(string)\(withjoiner)\(toString)")

  • }

  • }

  • var str1="Hello"

  • var str2="Swift"

  • var str3="——"

  • print("str1=\(str1)")

  • print("str2=\(str2)")

  • print("str3=\(str3)")

  • NewClass.joinerString(str1,toString: str2,withjoiner: str3)

运行结果如下所示:

  • str1=Hello

  • str2=Swift

  • str3=——

  • str1、str2、str3实现关联为:Hello——Swift

注意:在使用类方法时需要注意以下3点:

(1)存储属性

在一个类型方法中不可以使用存储属性,否则程序就会出现错误,如以下的代码,此代码实现的是输出字符串"Hello"。

  • import Foundation

  • class NewClass {

  • var str="Hello"

  • class func printHello(){

  • for index in str{

  • print(index)

  • }

  • }

  • }

  • NewClass.printHello()

由于str是存储属性,而printHello()是一个类型方法,在此代码中将str用在了printHello()方法中,导致程序出现了以下的错误:

  • 'NewClass.Type' does not have a member named 'str'

(2)类调用方法

所有的类型方法必须要使用类去调用,而非对象,否则就会出现错误,如以下的代码:

  • import Foundation

  • class NewClass {

  • class var str:String{

  • return "Hello"

  • }

  • class func printHello(){

  • for index in str.characters{

  • print(index)

  • }

  • }

  • }

  • let newClass=NewClass()

  • newClass.printHello()

由于在此代码中,方法printHello()是一个实例方法,但是在调用时,使用对象进行了调用,导致程序出现了以下错误:

  • 'NewClass' does not have a member named 'printHello'

(3)外部参数名

和实例方法相同, Swift默认给类型方法的第一个参数名称一个局部参数名称;默认同时给第二个和后续的参数名称局部参数名称和外部参数名称。在调用时,一定不要忘记外部参数名。

注意:在Swift1.2语言中允许在类中使用关键字static定义静态方法和属性(所谓静态属性或方法是指在程序运行时,分配的内存会一直存在。直到退出程序,内存才会释放这块空间)。其中,静态属性的定义如下:

  • static var 属性名:数据类型{

  • 返回一个值

  • }

或者为

  • static var 属性名:数据类型=值

静态方法的定义如下:

  • static func 方法名(参数1:数据类型, 参数1:数据类型,…) ->返回值类型{

  • }

以下将使用static关键字在类中声明一个静态属性,其语法形式如下:

  • import Foundation

  • class NewClass{

  • //静态属性

  • static var a:Int{

  • return 100

  • }

  • }

  • var newclass=NewClass()

  • print(NewClass.a)                                                                    //调用静态属性

运行结果如下所示:

  • 100

存储属性、局部变量和全局变量的区别

存储属性可以理解为变量的一种。所以随着变量使用地方的不同,可以将变量分为存储属性、局部变量和全局变量。这三种变量的不同如表8-1所示。

表8-1  三种变量的不同


注意:这里提到的方法在前面已经讲解过了。

【示例8-17】在以下定义了三个类型的变量分别为str、str1、str2,将它们使用在不同的地方。代码如下:

  • import Foundation

  • let str="Hello"

  • class NewClass {

  • let str1="Swift"

  • func printstring(){

  • let str2="World"

  • print(str)

  • print(str1)

  • print(str2)

  • }

  • }

  • let newclass=NewClass()

  • newclass.printstring()

在此代码中提到的方法会在以一节中讲解。运行结果如下所示:

  • Hello

  • Swift

  • World

注意:在使用存储属性、局部变量、和全局变量时一定要注意它们的作用域,所谓作用域就是指这些变量的有效范围,图8.5就是以上代码中变量的有效范围。


图8.5  作用域

如果一个变量超出了它的有效范围,程序就会出现错误,如以下的代码:

  • import Foundation

  • let str="Hello"

  • class NewClass {

  • let str1="Swift"

  • func printstring(){

  • let str2="World"

  • print(str)

  • print(str1)

  • print(str2)

  • }

  • func printstr(){

  • print(str)

  • print(str1)

  • print(str2)

  • }

  • }

  • let newclass=NewClass()

  • newclass.printstring()

在此代码中str2是一个定义在printstring()方法中的局部变量,所以它的有效范围就是在此方法中。但是在此方法之外使用会出现错误,在此代码中将str2又使用在了方法printstr()中。导致程序出现了以下的出现:

  • Use of unresolved identifier 'str2'

局部变量和存储属性同名的解决方法——self属性

在一个类中,方法中的局部变量可能和存储属性同名,这是,不可以直接使用相同的名称去访问存储属性,为了解决这一问题,Swift引入了一个self属性。如以下代码,此代码的功能是使用self对存储属性进行访问。代码如下:

  • import Foundation

  • class NewClass{

  • var count:Int=100

  • func printcount(){

  • let count:Int=50

  • print(count)

  • print(self.count)

  • }

  • }

  • let newClass=NewClass()

  • newClass.printcount()

count表示的是局部变量的值50,self.count表示存储属性的值100。运行结果如下所示:

  • 50

  • 100

本文选自:Swift2.0语言快速入门v3.0 大学霸内部资料,转载请注明出处,尊重技术尊重IT人!

Swift2.0语言教程之类的方法相关推荐

  1. Swift2.0语言教程之类的嵌套与可选链接

    Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...

  2. Swift2.0语言教程之下标脚本

    Swift2.0语言教程之下标脚本 下标脚本 下标脚本是访问对象.集合或者序列的快速方式.开发者不需要调用实例特定的赋值和访问方法,就可以直接访问所需要的数值.例如在数组中,可以直接使用下标去访问或者 ...

  3. Swift2.0语言教程之类的属性

    Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型--类.它是人们构建代码所用的一种通用.灵活的 ...

  4. Swift2.0语言教程之闭包

    Swift2.0语言教程之闭包 Swift2.0语言闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语 ...

  5. Swift2.0语言教程之函数嵌套调用形式

    Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还可以调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其他函数:另 ...

  6. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  7. Xamarin XAML语言教程通过ProgressTo方法对进度条设置

    Xamarin XAML语言教程通过ProgressTo方法对进度条设置 在ProgressBar中定义了一个ProgressTo方法,此方法也可以用来对进度条当前的进行进行设置,ProgressTo ...

  8. Swift3.0语言教程字符串与URL的数据转换与自由转换

    Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...

  9. Swift3.0语言教程字符串与文件的数据转换

    Swift3.0语言教程字符串与文件的数据转换 Swift3.0语言教程字符串与文件的数据转换,如果想要对字符串中的字符进行永久保存,可以将字符串中的字符写入到文件中.当然,开发者也可以将写入的内容进 ...

最新文章

  1. SQL Server2012登录记录怎么删除?
  2. Steps to developing Metro style apps 第一章-Creat a UI(2)(4)
  3. OSS.Social微信项目标准库介绍
  4. Spark 独立部署模式
  5. dbms标识符无效_DBMS中的聚合运算符(分组依据和具有子句)
  6. Vue之条件渲染v-if和v-show
  7. pythonnumpy矩阵详解_python常用模块numpy解析(详解)
  8. linux之dd命令
  9. BERT源码分析(二)
  10. 8个免费、高质量PPT素材网站,值得收藏
  11. GoldenDict音标乱码
  12. VBA教程初级(二):数据结构
  13. 图像相似的算法有哪些,图像相似的算法是什么
  14. 工程伦理第三章学习笔记2020最新
  15. 物联网(IOT)之常见物联网通信技术概览-无线篇①
  16. 2022年认证杯SPSSPRO杯数学建模C题(第一阶段)污水流行病学原理在新冠疫情防控方面的作用求解全过程文档及程序
  17. Alibaba Cloud Toolkit —— 项目一键部署工具
  18. 2020年webpack面试题
  19. 从数据仓库到数据集市
  20. inventor 波纹阵列_Inventor技巧之草图驱动的阵列

热门文章

  1. BUILD 2015: Visual Studio对GitHub的支持
  2. virtual keyboard
  3. eclipse的菜单栏消失问题解决
  4. 批处理清除VisualStudio解决方案文件夹
  5. Java Scoket之java.io.EOFException解决方案
  6. uniapp、vue,vuex中state改变,getters不动态改变的完美解决方案!
  7. Mac 下GitHub 访问慢解决方案
  8. Python 中异常嵌套
  9. 解决pycharm问题:module ‘pip‘ has no attribute ‘main‘
  10. 获取jQuery中的复选框值