Swift2.0语言教程之类的方法
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语言教程之类的方法的更多相关文章
- Swift2.0语言教程之类的嵌套与可选链接
Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...
- Swift2.0语言教程之下标脚本
Swift2.0语言教程之下标脚本 下标脚本 下标脚本是访问对象.集合或者序列的快速方式.开发者不需要调用实例特定的赋值和访问方法,就可以直接访问所需要的数值.例如在数组中,可以直接使用下标去访问或者 ...
- Swift2.0语言教程之类的属性
Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型——类.它是人们构建代码所用的一种通用.灵活的 ...
- Swift2.0语言教程之函数嵌套调用形式
Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还能够调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其它函数:还 ...
- Swift2.0语言教程之闭包
Swift2.0语言教程之闭包 Swift2.0语言闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语 ...
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- Swift3.0语言教程字符串与URL的数据转换与自由转换
Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...
- Swift3.0语言教程字符串与文件的数据转换
Swift3.0语言教程字符串与文件的数据转换 Swift3.0语言教程字符串与文件的数据转换,如果想要对字符串中的字符进行永久保存,可以将字符串中的字符写入到文件中.当然,开发者也可以将写入的内容进 ...
- Swift3.0语言教程使用URL字符串
Swift3.0语言教程使用URL字符串 Swift3.0语言教程使用URL字符串,和路径一样,URL其实也是字符串,我们可以将这些字符串称为URL字符串.本小节将讲解URL字符串的使用. 1.编码 ...
随机推荐
- 什么是EOF -- 转
转载地址:http://www.ruanyifeng.com/blog/2011/11/eof.html 我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示&quo ...
- POJ 1240 Pre-Post-erous! && East Central North America 2002 (由前序后序遍历序列推出M叉树的种类)
题目链接 问题描述 : We are all familiar with pre-order, in-order and post-order traversals of binary trees. ...
- oracle数据类型表
set SERVEROUTPUT ON declare v_char ); v_varchar2 ); begin v_char:='java'; v_varchar2:='java'; DBMS_O ...
- java中并发Queue种类与各自API特点以及使用场景!
一 先说下队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部) 就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经 ...
- 39 - 同步-异步-IO多路复用
目录 1 同步与异步 2 阻塞与非阻塞 3 什么是IO 3.1 内核态用户态 3.2 IO两个阶段 3.3 IO模型 3.3.1 同步阻塞IO 3.3.2 同步非阻塞IO 3.3.3 IO多路复用 3 ...
- 【Linux】Linux基本命令扫盲【转】
转自:http://www.cnblogs.com/lcw/p/3762927.html [VI使用] 1.在命令行模式 :在vi编辑器中将光标放在函数上,shift + k 可直接man手册 ...
- C# 读取指定文件夹下所有文件
#region 读取文件 //返回指定目录中的文件的名称(绝对路径) string[] files = System.IO.Directory.GetFiles(@"D:\Test" ...
- 在jsp页面中设置了远程验证,在初始化时必须预先调用一次。
参考链接:http://code.taobao.org/p/sztaotao/diff/5/trunk/code/src/main/webapp/webpage/modules/sys/roleFor ...
- 31 Godoc: documenting Go code 编写良好的文档关于godoc
Godoc: documenting Go code 编写良好的文档关于godoc 31 March 2011 The Go project takes documentation seriousl ...
- Ubuntu下apache2启动、停止、重启、配置
Linux系统为Ubuntu 一.Start Apache 2 Server /启动apache服务# /etc/init.d/apache2 startor$ sudo /etc/init.d/ap ...