swift之mutating关键字
在 swift 中,包含三种类型(type): structure , enumeration , class
其中structure和enumeration是值类型( value type ),class是引用类型( reference type )
但是与objective-c不同的是,structure和enumeration也可以拥有方法(method),其中方法可以为实例方法(instance method),也可以为类方法(type method),实例方法是和类型的一个实例绑定的。
在swift官方教程中有这样一句话:
“Structures and enumerations are value types.By default, the properties of a value type cannot be modified from within its instance methods.”摘录来自: Apple Inc. “The Swift Programming Language”。 iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
大致意思就是说,虽然结构体和枚举可以定义自己的方法,但是默认情况下,实例方法中是不可以修改值类型的属性。
举个简单的例子,假如定义一个点结构体,该结构体有一个修改点位置的实例方法:
struct Point {
var x = 0, y = 0
func moveXBy(x:Int,yBy y:Int) {
self.x += x
// Cannot invoke '+=' with an argument list of type '(Int, Int)'
self.y += y
// Cannot invoke '+=' with an argument list of type '(Int, Int)'
}
}
编译器抛出错误,说明确实不能在实例方法中修改属性值。
为了能够在实例方法中修改属性值,可以在方法定义前添加关键字 mutating
struct Point {
var x = 0, y = 0
mutating func moveXBy(x:Int,yBy y:Int) {
self.x += x
self.y += y
}
}var p = Point(x: 5, y: 5)p.moveXBy(3, yBy: 3)
另外,在值类型的实例方法中,也可以直接修改self属性值。
enum TriStateSwitch {
case Off, Low, High
mutating func next() {
switch self {
case Off:
self = Low
case Low:
self = High
case High:
self = Off
}
}
}
var ovenLight = TriStateSwitch.Low
ovenLight.next()
// ovenLight is now equal to .High
ovenLight.next()
// ovenLight is now equal to .Off”
TriStateSwitch枚举定义了一个三个状态的开关,在next实例方法中动态改变self属性的值。
当然,在引用类型中(即class)中的方法默认情况下就可以修改属性值,不存在以上问题。
[参考资料: The Swift Programming Language ] from iBook
最后我想问大家一个问题, 学swift那家强?
swift之mutating关键字相关推荐
- Swift标识符和关键字
任何一种计算机语言都离不开标识符和关键字,下面我们将详细介绍Swift标识符和关键字. 标示符 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等指定的名字.构成标识符的字母均有一定的规范, ...
- Swift 中的关键字详解
转载自:https://www.cnblogs.com/liYongJun0526/p/7522130.html 要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在S ...
- swift_038(Swift之guard关键字(守护))
Swift - guard关键字(守护) guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么.但与if语句不同的是,guard语句只会有一个代码块,不像if语句可 ...
- Swift 协议(Protocols)
协议定义了一个蓝图,规定了用来实现某一特定工作或者功能所必需的方法和属性.类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能.任意能够满足协议要求的类型被称为遵循(confo ...
- Swift-27个知识点
1.柯里化(Currying) Swift 里可以将方法进行柯里化 (Currying),也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果的新方法 func a ...
- swift. 扩展类添加属性_swift中的声明关键字详解
原起 学习swift,swift中的关键字当然要了解清楚了,最近在网上看到了关于声明关键字的文章,整理记录一下. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...
- Swift关键字总结下篇
Swift关键字总结上篇 Swift关键字总结下篇 Swift中有多少关键字? 在Swift官方文档的词汇结构中, 有非常多的关键字, 它们被用于声明中.语句中.表达式中.类中.模式中, 还有以数字符 ...
- Swift学习笔记-协议(Protocols)
1.0 翻译:geek5nan 校对:dabing1022 2.0 翻译:futantan 校对:小铁匠Linus 定稿:shanksyang 本页包含内容: 协议的语法(Protocol Synta ...
- swift_028(Swift 的协议)
//***********swift学习之28--协议--*************************** /* 协议规定了用来实现某一特定功能所必需的方法和属性. 任意能够满足协议要求的类型被 ...
最新文章
- python【蓝桥杯vip练习题库】ALGO-189 P0505(阶乘问题)
- Python PhantomJS 爬虫 示例
- js如何判断当前文本的输入状态——中文输入法的那些坑
- LeetCode_字符串类
- 如何优化Hive SQL ??
- 训练日志 2018.10.31
- java并发:初探sleep方法
- app测试的过程和重点关注内容
- 【java】swing构件的操作
- python利用pygame框架实现类似大鱼吃小鱼游戏 (松鼠吃松鼠) code from making games with python and pygame
- ArcGIS案例学习笔记4_2_水文分析批处理地理建模
- Linux 镜像文件下载
- 力扣994:腐烂的橘子(BFS)
- css之sticky定位
- ElasticSearch 数据迁移
- ubuntu常用的服务器搭建
- 用Winrar打造永不被杀的免杀捆绑器!
- 安装MAC系统必备工具
- 说说对React refs 的理解?应用场景?
- openwrt配置内核驱动_openWRT最小内核/应用模块的添加++++config.in/Kbuild调用树(先后顺序)...
热门文章
- CentOS7安装apache2并启动
- 用拼音输入希腊字母的方法
- MySQL怎么用x28改变颜色_MySQL SELECT练习题*28
- 笔记本没有计算机和网络怎么回事,华为笔记本连wifi无internet怎么办?华为笔记本电脑怎么连不上网?...
- Android adb shell后面可用的常用命令详细列举
- h5自动播放视频且有声音的办法
- 橄榄核雕:始知真放在精微
- 数据结构和算法(二):摘要算法之SHA和MD5
- 1.1.7. Least Angle Regression(最小角回归)和 1.1.8. LARS Lasso
- 掌握好亚马逊品类销量排名规则助力备战旺季!