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.具有参数的实例方法

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

    (参数1:数据类型,参数2:数据类型)->返回值类型 它的调用形式如下:

      1,sans-serif; line-height:1.5">2,sans-serif; line-height:1.5">)

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

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

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

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

    • import Foundation

    • class Counter {

    • var count = 0

    • //count1

    • 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,在每调用一次此方法时,都会在原来值的基础上增加1incrementBy()方法是将当前的值和指定的数相加。运行结果如下所示:

      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

    • }

    • }

    • let counter = AddClass()

    • counter.add(5,amount2: 10)

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

      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

    • }

    • }

    • let counter = MultiplyClass()

    • counter.multiply(5,sans-serif; font-size:14px"> 在定义时,第二个参数前加上了“_”下划线。所以调用的时候,第二个参数可以省略外部参数名。运行结果如下所示:

        50

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

      • import Foundation

      • class NewClass {

      • func printHello(){

      • print("Hello")

      • }

      • }

      • printHello()

      错误信息如下:

      • Use of unresolved identifier 'printHello'

      Swift2.0语言的类型方法

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

        class类名 class func方法名) {

      • }

      • }

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

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

        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

      • 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("str1str2str3实现关联为:\(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=——

  • str1Hello——Swift

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

1)存储属性

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

  • import Foundation

  • class NewClass {

  • var str="Hello"

  • class func printHello(){

  • for index in str{

  • 由于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 func方法名) ->返回值类型

    • }

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

      //静态属性

    • static var a:Int{

    • return 100

    • }

    • }

    • var newclass=NewClass()

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

  • 100

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

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

8-1三种变量的不同


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

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

  • 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表示的是局部变量的值50self.count表示存储属性的值100。运行结果如下所示:

    50

  • 100

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
基于yolov5+deepsort+slowfast算法的视频实时行为检测。1. yolov5实现目标检测,确定目标坐标 2. deepsort实现目标跟踪,持续标注目标坐标 3. slowfast实现动作识别,并给出置信率 4. 用框持续框住目标,并将动作类别以及置信度显示在框上
数字电子钟设计本文主要完成数字电子钟的以下功能1、计时功能(24小时)2、秒表功能(一个按键实现开始暂停,另一个按键实现清零功能)3、闹钟功能(设置闹钟以及到时响10秒)4、校时功能5、其他功能(清零、加速、星期、八位数码管显示等)前排提示:前面几篇文章介绍过的内容就不详细介绍了,可以看我专栏的前几篇文章。PS.工程文件放在最后面总体设计本次设计主要是在前一篇文章 数字电子钟基本功能的实现 的基础上改编而成的,主要结构不变,分频器将50MHz分为较低的频率备用;dig_select
1.进入官网下载OBS stdioOpen Broadcaster Software | OBS (obsproject.com)2.下载一个插件,拓展OBS的虚拟摄像头功能链接:OBS 虚拟摄像头插件.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)提取码:6656--来自百度网盘超级会员V1的分享**注意**该插件必须下载但OBS的根目录(应该是自动匹配了的)3.打开OBS,选中虚拟摄像头选择启用在底部添加一段视频录制选择下面,进行录制.
Meta公司在9月29日首次推出一款人工智能系统模型:Make-A-Video,可以从给定的文字提示生成短视频。基于**文本到图像生成技术的最新进展**,该技术旨在实现文本到视频的生成,可以仅用几个单词或几行文本生成异想天开、独一无二的视频,将无限的想象力带入生活
音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结一、前言之前一直对硬件上的内容比较关注,但是可能是因为硬件方面的东西可能真的是比较杂,而且需要渗透的东西太多了,所以学习进展比较缓慢。因为也很少有单纯的硬件学习研究,总是会伴随着各种理论需要硬件做支撑,所以还是想要慢慢接触理论学习。但是之前总找不到切入点,不知道从哪里开始,就一直拖着。最近稍微接触了一点信号处理,就用这个当作切入点,开始接触理论学习。二、信号分析及加噪信号处理选用了matlab做工具,选了一个最简单的语音信号处理方
腾讯云 TRTC 实时音视频服务体验,从认识 TRTC 到 TRTC 的开发实践,Demo 演示& IM 服务搭建。
音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐资源的高效组织、检索和推荐等相关方面的研究和应用具有重要意义。传统的音乐分类方法大量使用了人工设计的声学特征,特征的设计需要音乐领域的知识,不同分类任务的特征往往并不通用。深度学习的出现给更好地解决音乐分类问题提供了新的思路,本文对基于深度学习的音乐音频分类方法进行了研究。首先将音乐的音频信号转换成声谱作为统一表示,避免了手工选取特征存在的问题,然后基于一维卷积构建了一种音乐分类模型。
C++知识精讲16 | 井字棋游戏(配资源+视频)【赋源码,双人对战】
本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。
在本篇博文中,我们谈及了 Swift 中 some、any 关键字以及主关联类型(primary associated types)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。