[Swift]方法

Swift - 方法派发机制 静态派发:适用于值类型、Final 类和方法,性能最高。动态派发:适用于类的继承和重写,通过虚表派发。协议派发:适用于协议方法,通过协议见证表派发。消息转发:适用于与 Objective-C 交互和动态方法解析。理解这些派发机制有助于编写高效且符合预期的 Swift 代码。 阅读详情

1. 方法的命名规则以及参数名规则:

    1) 方法就是枚举、结构体、类中定义的“函数”,但是它跟函数在命名方面有很大的不同;

    2) 首先看一下参数命名规则:

class A
{
    func increBy(inc: Int, atIndex: Int) { }
}

// A().increBy(inc: 5, atIndex: 34) // 默认情况下不会为第一个参数设置外部参数名
// A().increBy(5, 23) // 第一个参数之后的所有参数必须有外部参数名,默认为和内部参数名相同,因此不需要加#
A().increBy(5, atIndex: 15) // OK!

class B
{
    // 强行为第一个参数添加外部参数名,第二个参数使用#强调内外一致(其实是不必要的,编译器会警告)
    // 第三个参数自己定义外部参数名
    func increBy(#inc: Int, #atIndex: Int, oth one: Int) { }
}

B().increBy(inc: 23, atIndex: 94, oth: 23) // OK!
    3) 参数规则看上去很古怪其实是为了配合函数的命名规则的:

         i) 实际上函数的命名规则是任意的,只要符合标示符命名规则即可,但是Swift强调和建议使用其约定俗成的命名规则,并且如果使用该约定的规则就可以和参数命名规则很好的配合,是代码更加清晰明确;

         ii) Swift建议函数以动词开头,最后一个单词或者倒数第二个单词为介词,之所以第一个参数可以没有外部参数名就是因为Swift建议函数名中的介词在表意上指向第一个参数,这样第一个参数即使没有外部名称意思也会非常明确,达到简洁明了的效果,比如上面的increBy(23, atIndex: 15),就是指以23为增长单位,对下标为15的位置的元素进行增长,这看上去非常自然明了;

         iii) 同时,第一个以后的参数名Swift建议以介词开头,因为一般方法的参数都是方法作用的对象或作用的介质,因此都以介词打头会非常明了,由于第一个参数作用的介词在函数名中已经体现了,而后面的参数作用的介词在函数名中并不存在,因此Swift强制要求之后的参数必须要有外部参数名(并且建议外部参数名都以介词打头),这样就保证了方法的每个参数的含义和作用都非常清晰(只看接口就能看懂),C++就不如Swift的这点了,C++接口都没有参数名,而且参数有那么多,让人很头晕,大大增加了程序员的记忆压力;


2. self以及结构体和枚举方法的变异:

    1) 使用self(即和C++的this一样)消除同名参数歧义,以及必要时访问自身(很明显只能用于实例而不能用于静态):

class A
{
    var a: Int = 5
    var b: Int = 3
    
    func change(a: Int, b: Int)
    {
        self.a = a
        self.b = b
    }
}
    2) Swift默认在结构体和枚举中的方法不能修改属性的!这就体现出来Swift对结构体的定位了,Swift希望结构体的方法不对属性进行修改而仅仅是用来进行输出信息等操作,因此Swift将结构体定位成一种小型的数据包,如果硬要修改就只要把方法定义成变异类型就行了,使用关键字mutating修饰即可:

struct A
{
    var a: Int = 5
    
    func change(var aa: Int)
    {
        aa = 5 // 要让参数可修改加var即可
        // a = aa // 但是存储属性是默认不能在方法中修改的!但是可以在外部通过.a = newa的方式修改!
    }
    
    mutating func change2(var aa: Int) // 声明称变异方法后就可以在方法中修改存储属性
    {
        // 这样参数和存储属性都可以修改了
        aa = 10
        a = aa // 前提是a必须是var
    }
}
对于枚举是一样的!

    3) 不仅可以对存储属性修改,还可以修改self的值(注意,结构体和枚举都是值类型的):

enum Test: String
{
    case a = "a"
    case b = "b"
    case c = "c"
    
    mutating func next()
    {
        switch self
        {
        case .a: self = .b
        case .b: self = .c
        case .c: self = .a
        }
    }
}

var test = Test.a

println(test.rawValue) // a
test.next()
println(test.rawValue) // b
test.next()
println(test.rawValue) // c
test.next()
println(test.rawValue) // a
    4) 变异仅仅针对枚举和结构体,对于类来说想改就改的,前面已经出现过很多次了:

class A
{
    var a: Int = 5
    
    func change(aa: Int)
    {
        a = aa // 对于类来说想改就改,其实之前都已经演示过很多回了!
    }
}


3. 静态方法:

    1) 和静态属性一样,属于类型不属于示例,只能通过类型名调用的方法;

    2) 同样,静态方法可以调用其它静态方法或属性并且不需要类型名,但静态方法不可以调用任何非静态的成员,而静态成员可以随意调用静态方法以及访问静态属性,但是调用和访问的时候必须使用类型名;

    3) 结构体和枚举还是使用static修饰方法,而类使用class修饰,这里就以类作为例子好了:

class A
{
    class var a: Int {
        return 5
    }
    class func geta() -> Int {
        return a
    }
    
    var b: Int {
        return A.geta() // 非静态属性或方法中调用静态属性必须要通过类型名!否则会报错
    }
}
    4) 在静态方法中也可以使用self,只不过这里的self实质类型本身而不是指实体,一般不建议使用(在其它语言中是不支持这种使用方法的):

并且在结构体和类中,虽然默认不能修改实例属性,但是可以随意修改静态属性而不需要变异!

struct A
{
    static var a: Int = 5
    
    // 虽然默认普通存储属性在方法中不能修改
    // 但是静态属性是可以随意修改的!
    
    static func change() // 通过静态方法修改静态存储属性
    {
        self.a = 10 // 这里的self表示A类型自身
    }
    
    func change2() // 通过实例方法修改静态存储属性
    {
        A.a = 10
    }
}

 
iOS swift调用oc的category中的方法 前面把私有库建立好了,但是在swift工程中调用库时,category中的方法调用不到。尝试了很久之后,发现category中的类方法可以调,但是实例方法不行,所以暂时解决方案是将实例方法改成类方法,将实例以参数的方式传进去。 例如: 实例方法: - (void)addMyView { UIView * view = [[UIView alloc] init]; [self addSubVie... 阅读详情

相关推荐

swift中使用OC的方法;在OC中调用swift方法

swift中使用OC的方法;在OC中调用swift方法

wj748499404的博客 5326

Swift 方法

方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实力封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。类型方法与 Objective-C 中的类方法(class methods) 相似。结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一。在 Objective-C 中,类是唯一能定义方法的类型。

xiaoxiaobukuang的专栏 938

swift中RxSwift与RxCocoa的使用案例

一个swift中使用rxswift与rxcocoa的使用案例,初学者使用。

Swift 中的方法调用机制

在 iOS 开发中,Swift 和 Objective-C 是两种常用的编程语言。尽管它们都能用于开发应用程序,但在方法调用的底层机制上存在显著差异。本文将详细介绍 Swift 的方法调用机制,重点对比 Objective-C 的实现,并深入探讨虚表(V-Table)和 Witness Table 机制。

侯仕奇的博客 1524

手把手教你用UC3844设计多路输出反激电源(附PCB布局避坑指南)

本文详细介绍了使用UC3844设计多路输出反激电源的实战技巧,包括核心电路设计、变压器参数计算、PCB布局优化及EMI抑制方法。通过实验室实测数据和项目经验,帮助工程师避开常见设计陷阱,提升电源性能和可靠性。特别附赠PCB布局避坑指南,助力高效完成开关电源设计。

weixin_30300225的博客 568

Excel也能玩转K-means聚类?手把手教你用表格搞定用户分群(附完整公式)

本文详细介绍了如何在Excel中实现K-means聚类算法,无需编程即可完成用户分群。通过SUMIF、SQRT等基础函数,从数据预处理到最终分群全流程手把手教学,特别强调数据标准化和迭代优化的关键步骤,帮助运营团队低成本高效分析用户行为数据。

weixin_30555125的博客 181

swift协议方法实现_Swift中使协议方法成为可选方法的2种方法

swift协议方法实现In this article, we’ll learn about two ways to make protocol methods optional. We’ll explore the advantages and disadvantages of each approach. 在本文中,我们将学习使协议方法成为可选方法的两种方法。 我们将探讨每种方法的优缺点。 W...

weixin_26638123的博客 935

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 894

Swift 对象方法

Swift 类的方法也分对象方法和类方法,我们先简单看一下对象方法。 我们分三类来分析 我们看一个例子,创建一个学生类 Student,他有四个属性 姓名 name,年龄 age,性别 sex,知识 knowledge 我们定义三个方法 学习 1,不带参数,只要学生调用了学习方法知识+1 2,带两个参数,第一个参数subject 表示学习的课程,第二个参数表示学习的课时 3,参数同2

2002

绿标短网址app.10086.cn/xxxxx移动短网址缩短接口网址api调用php方式解析

绿标短网址app.10086.cn/xxxxx 移动网缩短接口网址api调用php方式解析 app.10086.cn是移动网站的接口,可以制作移动网等第三方官方网站域名的任意生成接口,由于是认证企业,可以再抖音 微信 qq等第三方渠道正常打开不拦截提示,第三方网址,头条文章等,效果非常号,这里记录下api接口,纯技术php生成,具体规则可以去抖音的开放平台去申请对应接口 。这里用我php模拟抓包获取方式 GET http://www.app10086cn.cn/?i=app.10068.cnHTTP/1.1

qq_20300095的博客 5908

【数据集】全球湿度数据集总结

【数据集】全球湿度数据集总结

WW、forever的博客 1661

swift怎么调用Java_Swift方法

本篇文章帮大家学习Swift方法,包含了Swift方法使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。在Swift 4语言中,与特定类型关联的函数称为“方法”。 在Objective C中,类用于定义方法,而Swift 4语言为用户提供了为类,结构体和枚举也提供方法,提高了灵活性。实例方法在Swift 4语言中,通过实例方法访问类,结构体和枚举实例。实例方法提供功能 -...

weixin_31967485的博客 718

大数据与宠物:健康监测数据分析

随着全球宠物市场规模的快速增长(2023年全球宠物产业规模已达3500亿美元),宠物健康管理需求呈现指数级上升。传统宠物医疗依赖定期体检和症状观察,存在滞后性和主观性缺陷。本文聚焦如何通过物联网(IoT)设备采集宠物生理数据(体温、心率、活动量等),利用大数据分析技术构建实时健康监测系统,实现宠物健康状态的动态评估、异常预警和疾病预测。研究范围涵盖数据采集技术、数据预处理方法、机器学习模型构建及实际应用场景落地。背景介绍:明确研究目的、目标读者及核心术语核心概念与联系。

2502_91592937的博客 1067

swift方法

方法定义 Methods are functions that are associated with a particular type. Classes, structures, and enumerations can all define instance methods, which encapsulate specific tasks and functionality for wor

frankisbaby的博客 363

ShengBTE热导计算:利用ShengBTE计算热导显示NAN的原因是什么?算出的热导不随平均声子自由程变化

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 963

上机任务一:空气质量指数 (air quality index,AQI是定量描述空气质量状况的指数。为了更好地了解和人们身体健康息息相关的天气状况,本书模拟生成500条某地区天气数据,一行样本对应一天

调整后的R平方为0.4308,考虑了模型中的自由度,它略低于多重R平方,说明模型的解释能力可能有限。总的来说,新的模型相对于之前的模型在AIC值上更优,包含了最高温度(X2)和最低温度(X3)这两个重要的预测因子,并且对AQI的解释能力较好。在表中,Df表示自由度,Sum Sq表示总平方和,Mean Sq表示均方(总平方和除以自由度),F value表示F统计量,Pr(>F)表示对应的p值。在分析这些结果时,需要关注系数的显著性(p值),系数的方向(正向或负向影响),以及系数的大小(估计值)。

Mrrunsen的博客 723

swift 中,protocol的optional方法

swift推出一年多了,断断续续学了一些,一直没有真正引入自己的项目中。 最近准备做一个 Today Extension,恰好是一个机会可以完整的使用swift开发。刚刚做了几天,就发现又一次被Apple忽悠了,感觉就像iOS6.0时代的AutoLayout,经常掉坑儿里。 尤其是swift和objc的interoperability,最简单、也是困扰我时间最长的就是protocol中的optio

wershest的专栏 7624

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

swift 方法

实例方法 实例方法是属于某个特定类、结构体或者枚举类型实例的方法。实例方法提供访问和修改实例属性的方法或者提供与实例目的相关的功能,并以此来支撑实例的功能。 下面的例子,定义一个简单的Counter类:

ChasingDreamsCoder的博客 410

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Swift方法嵌套

想想看,有多少次我们因为一个方法主体内容过长,而不得不将它重够为好几个小的功能模块方法,然后在原来的主体方法中去调用这些小方法? 在Swift中,对于这种情况有了解很好的应对措施,我们可以在方法中定义其他方法,也就是说,让方法嵌套起来。 例如: func appendQuery(var url:String, key:String, value:AnyObject) -> S

逢个场,作个戏 633

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

swift 引用swift_方法混乱 Swift

swift 引用swift 第一件事 (First things first) Before the explanation about Method Swizzling, it’s important to understand what is the Swift Runtime, once it’s a key concept that enables language features li...

weixin_26638123的博客 359

swift php 交互,Swift 方法

Swift 方法是与某些特定类型相关联的函数在 Objective-C 中,类是唯一能定义方法的类型。但在 Swift 中,你不仅能选择是否要定义一个类/结构体/枚举,还能灵活的在你创建的类型(类/结构体/枚举)上定义方法。实例方法在 Swift 语言中,实例方法是属于某个特定类、结构体或者枚举类型实例的方法。实例方法提供以下方法:可以访问和修改实例属性提供与实例目的相关的功能实例方法要写在它所属...

weixin_39769187的博客 281

swift与OC混编(方法调用)

原创文章转载请注明出处。 背景在上一篇文章中简单讲述了怎么创建Swift和OC的混编工程。本篇讲一下Swift和OC的混编工程中的方法调用。OC调用SwiftOC调用Swift方法比较简单。但是需要注意以下几点: 1.需要在当前OC类里导入xxx-Swift.h头文件,其中xxx为项目名称(与你的项目配置相关,具体配置方式见上一篇文章) 2.OC类里仅可以调用public的Swift方法和变量 3.

有梦想的蜗牛 1万+

Swift - 方法嵌套

方法终于成为了“一等公民”,也就是说,我们可以将方法当做变量或者参数来使用了。更进一步的,我们甚至可以在一个方法中定义新的方法,这给代码结构层次和访问级别的控制带来了新的选择。 想想看,有多少次我们因为一个方法主体内容过长,而不得不将他重构为好几个小的功能块方法,然后在原来的主体方法中调用这些小方法?这些具体负责一个个小功能块的方法也许“一辈子”就被调用一次,却不得不存在于整个类型的作用域中。虽然我们会将它们标记位私有方法,但是事实上它们所承担的任务往往和这个类型没有直接关系,而只会在这个类型中的某个方法中

HumorousGhost 539
上一篇: [Swift]属性和下标
下一篇: [Swift]构造和析构
Lirx_Tech
博客等级 码龄12年 215粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值