原文  http://blog.csdn.net/tounaobun/article/details/39694233

在  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关键字相关推荐

  1. Swift标识符和关键字

    任何一种计算机语言都离不开标识符和关键字,下面我们将详细介绍Swift标识符和关键字. 标示符 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等指定的名字.构成标识符的字母均有一定的规范, ...

  2. Swift 中的关键字详解

    转载自:https://www.cnblogs.com/liYongJun0526/p/7522130.html 要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在S ...

  3. swift_038(Swift之guard关键字(守护))

    Swift - guard关键字(守护) guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么.但与if语句不同的是,guard语句只会有一个代码块,不像if语句可 ...

  4. Swift 协议(Protocols)

    协议定义了一个蓝图,规定了用来实现某一特定工作或者功能所必需的方法和属性.类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能.任意能够满足协议要求的类型被称为遵循(confo ...

  5. Swift-27个知识点

    1.柯里化(Currying) Swift 里可以将方法进行柯里化 (Currying),也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果的新方法 func a ...

  6. swift. 扩展类添加属性_swift中的声明关键字详解

    原起 学习swift,swift中的关键字当然要了解清楚了,最近在网上看到了关于声明关键字的文章,整理记录一下. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...

  7. Swift关键字总结下篇

    Swift关键字总结上篇 Swift关键字总结下篇 Swift中有多少关键字? 在Swift官方文档的词汇结构中, 有非常多的关键字, 它们被用于声明中.语句中.表达式中.类中.模式中, 还有以数字符 ...

  8. Swift学习笔记-协议(Protocols)

    1.0 翻译:geek5nan 校对:dabing1022 2.0 翻译:futantan 校对:小铁匠Linus 定稿:shanksyang 本页包含内容: 协议的语法(Protocol Synta ...

  9. swift_028(Swift 的协议)

    //***********swift学习之28--协议--*************************** /* 协议规定了用来实现某一特定功能所必需的方法和属性. 任意能够满足协议要求的类型被 ...

最新文章

  1. python【蓝桥杯vip练习题库】ALGO-189 P0505(阶乘问题)
  2. Python PhantomJS 爬虫 示例
  3. js如何判断当前文本的输入状态——中文输入法的那些坑
  4. LeetCode_字符串类
  5. 如何优化Hive SQL ??
  6. 训练日志 2018.10.31
  7. java并发:初探sleep方法
  8. app测试的过程和重点关注内容
  9. 【java】swing构件的操作
  10. python利用pygame框架实现类似大鱼吃小鱼游戏 (松鼠吃松鼠) code from making games with python and pygame
  11. ArcGIS案例学习笔记4_2_水文分析批处理地理建模
  12. Linux 镜像文件下载
  13. 力扣994:腐烂的橘子(BFS)
  14. css之sticky定位
  15. ElasticSearch 数据迁移
  16. ubuntu常用的服务器搭建
  17. 用Winrar打造永不被杀的免杀捆绑器!
  18. 安装MAC系统必备工具
  19. 说说对React refs 的理解?应用场景?
  20. openwrt配置内核驱动_openWRT最小内核/应用模块的添加++++config.in/Kbuild调用树(先后顺序)...

热门文章

  1. CentOS7安装apache2并启动
  2. 用拼音输入希腊字母的方法
  3. MySQL怎么用x28改变颜色_MySQL SELECT练习题*28
  4. 笔记本没有计算机和网络怎么回事,华为笔记本连wifi无internet怎么办?华为笔记本电脑怎么连不上网?...
  5. Android adb shell后面可用的常用命令详细列举
  6. h5自动播放视频且有声音的办法
  7. 橄榄核雕:始知真放在精微
  8. 数据结构和算法(二):摘要算法之SHA和MD5
  9. 1.1.7. Least Angle Regression(最小角回归)和 1.1.8. LARS Lasso
  10. 掌握好亚马逊品类销量排名规则助力备战旺季!