方法(学习笔记)

环境Xcode 11.0 beta4 swift 5.1

  • 方法

    • 结构体、枚举、类都可以定义方法(实例方法、类型方法)
  • 实例方法(Instance Methods)

    • 实例方法只能用实例来调用,不能单独使用

      1. class Counter {
      2. var count = 0
      3. func increment() {
      4. count += 1
      5. }
      6. func increment(by amount: Int) {
      7. count += amount
      8. }
      9. func reset() {
      10. count = 0
      11. }
      12. }
      13. let counter = Counter()
      14. // the initial counter value is 0
      15. counter.increment()
      16. // the counter's value is now 1
      17. counter.increment(by: 5)
      18. // the counter's value is now 6
      19. counter.reset()
      20. // the counter's value is now 0
    • self 属性,每个类型的实例都有的隐式的属性

      1. // 上面的increment()可写成如下形式
      2. func increment() {
      3. self.count += 1
      4. }
      5. // 如果方法的参数与实例相同时,就要显示的调用 self
      6. struct Point {
      7. var x = 0.0, y = 0.0
      8. func isToTheRightOf(x: Double) -> Bool {
      9. return self.x > x
      10. }
      11. }
      12. let somePoint = Point(x: 4.0, y: 5.0)
      13. if somePoint.isToTheRightOf(x: 1.0) {
      14. print("This point is to the right of the line where x == 1.0")
      15. }
      16. // Prints "This point is to the right of the line where x == 1.0"
    • 实例方法内修改值类型用 mutating 关键字修饰,该方法分配一个新的实例给隐藏的 self ,方法结束这个新的实例将会替换掉已经存在的实例

      1. // 枚举、结构体都是值类型
      2. struct Point {
      3. var x = 0.0, y = 0.0
      4. mutating func moveBy(x deltaX: Double, y deltaY: Double) {
      5. x += deltaX
      6. y += deltaY
      7. }
      8. }
      9. var somePoint = Point(x: 1.0, y: 1.0)
      10. somePoint.moveBy(x: 2.0, y: 3.0)
      11. print("The point is now at (\(somePoint.x), \(somePoint.y))")
      12. // Prints "The point is now at (3.0, 4.0)"
      13. // 不能用常量来调用 `mutating` 修饰的方法,因为常量不可修改
      14. let fixedPoint = Point(x: 3.0, y: 3.0)
      15. fixedPoint.moveBy(x: 2.0, y: 3.0)
      16. // this will report an error
    • 可变方法内给 self 赋值(Assigning to self Within a Mutating Method)

      1. // 上面的Point可以写成下面的形式
      2. struct Point {
      3. var x = 0.0, y = 0.0
      4. mutating func moveBy(x deltaX: Double, y deltaY: Double) {
      5. self = Point(x: x + deltaX, y: y + deltaY)
      6. }
      7. }
      8. // 枚举的可变方法
      9. enum TriStateSwitch {
      10. case off, low, high
      11. mutating func next() {
      12. switch self {
      13. case .off:
      14. self = .low
      15. case .low:
      16. self = .high
      17. case .high:
      18. self = .off
      19. }
      20. }
      21. }
      22. var ovenLight = TriStateSwitch.low
      23. ovenLight.next()
      24. // ovenLight is now equal to .high
      25. ovenLight.next()
      26. // ovenLight is now equal to .off
  • 类型方法

    • func 前用关键字 static 或者 class (只能在类中使用,且子类可以重写父类的实现)修饰,类型方法中 self 指向类型本身

      1. class SomeClass {
      2. class func someTypeMethod() {
      3. // type method implementation goes here
      4. }
      5. }
      6. SomeClass.someTypeMethod()
      1. struct LevelTracker {
      2. static var highestUnlockedLevel = 1
      3. var currentLevel = 1
      4. //
      5. static func unlock(_ level: Int) {
      6. if level > highestUnlockedLevel { highestUnlockedLevel = level }
      7. }
      8. //
      9. static func isUnlocked(_ level: Int) -> Bool {
      10. return level <= highestUnlockedLevel
      11. }
      12. //
      13. @discardableResult
      14. mutating func advance(to level: Int) -> Bool {
      15. if LevelTracker.isUnlocked(level) {
      16. currentLevel = level
      17. return true
      18. } else {
      19. return false
      20. }
      21. }
      22. }
      23. class Player {
      24. var tracker = LevelTracker()
      25. let playerName: String
      26. func complete(level: Int) {
      27. LevelTracker.unlock(level + 1)
      28. tracker.advance(to: level + 1)
      29. }
      30. init(name: String) {
      31. playerName = name
      32. }
      33. }
      34. var player = Player(name: "Argyrios")
      35. player.complete(level: 1)
      36. print("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)")
      37. // Prints "highest unlocked level is now 2"
      38. // 创建一个新的player
      39. player = Player(name: "Beto")
      40. if player.tracker.advance(to: 6) {
      41. print("player is now on level 6")
      42. } else {
      43. print("level 6 has not yet been unlocked")
      44. }
      45. // Prints "level 6 has not yet been unlocked"

[Swift从入门到精通]

Swift从入门到精通第八篇 - 方法 初识的更多相关文章

  1. Swift从入门到精通第十一篇 - 初始化 初识

    初始化(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 初始化 初始化是类.结构体.枚举生成实例的过程,为该类的每个存储属性设置初始值,有些在实例使用前的设置或初始化也可在此实现 ...

  2. Swift从入门到精通第七篇 - 扩展 初识

    扩展(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 扩展 为类.结构体.枚举.协议添加新功能,同OC的分类很像,但扩展没有名字 扩展可以添加计算实例属性和计算类型属性(不能添加 ...

  3. Redis从入门到精通:初级篇

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  4. Redis从入门到精通:初级篇(转)

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  5. SaltStack 入门到精通第三篇:Salt-Minion配置文件详解

    SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ  发布日期:2014-06-09 17:52:16   ##### 主要配置设置 ##### 配置 默认值 ...

  6. Spring Boot从入门到精通(八)日志管理实现和配置信息分析

    Spring Boot对日志的处理,与平时我们处理日志的方式完全一致,它为Java Util Logging.Log4J2和Logback提供了默认配置.对于每种日志都预先配置使用控制台输出和可选的文 ...

  7. Hibernate从入门到精通(八)一对多单向关联映射

    上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射,这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按照我们的惯例 ...

  8. Egret入门学习日记 --- 第八篇(书中 2.0~2.6节 内容)

    第八篇(书中 2.0~2.6节 内容) 好!开始把前三章的内容录入进来. 但是!由于第一章说的内容都是在介绍白鹭引擎的背景信息,我就不在日记中写了. 直接开始从第二章写起. 2.0节 中提到了IDE( ...

  9. Swift从入门到精通第十四篇 - 错误处理 初识

    错误处理(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 错误表现和抛出 在 swift 中,错误由符合 Error 协议的类型值表示 // 示例 enum VendingMac ...

随机推荐

  1. 的Blog

    作者:Ovear链接:https://www.zhihu.com/question/20215561/answer/40316953来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  2. Socket编程:UDP和TCP概论及案例

    网络编程的三要素: 1.IP地址  2.端口 3.协议 什么是Socket? Socket就是通信链路的端点称"套接词". 基于TCP协议的Socket网络通信: 用来实现双向安全 ...

  3. JavaScript&jQuery学习笔记

    前端JavaScript学习 JavaScript导入方式:1.外部文件导入<script src="myScript.js"></script> 2.在标 ...

  4. @Value注解 和 @Data注解

    @Value注解 service层代码 @Service public class HelloServiceImpl implements HelloService { @Autowired priv ...

  5. exe4j打包--jar打包exe

    本文重点介绍如何将我们写的java代码打包成在电脑上可以运行的exe文件.这里只介绍直接打包成exe的方法,至于打包成exe安装包下节介绍 test 软件准备 exe4j集合包下载地址(下节内容也在这 ...

  6. LeetCode_62_不同路径

    /** * @author jianw.li * @date 2019/1/22 11:11 PM * @Description: 不同路径 * 一个机器人位于一个 m x n 网格的左上角 (起始点 ...

  7. 深入解析Mysql中事务的四大隔离级别及其所解决的读现象

    本文详细介绍四种事务隔离级别,并通过举例的方式说明不同的级别能解决什么样的读现象.并且介绍了在关系型数据库中不同的隔离级别的实现原理. 在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执 ...

  8. 帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析

    帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析 一.漏洞描述 该漏洞是由于安装程序时没有对用户的输入做严格过滤,导致用户输入的可控参数被写入配置文件,造成任意代码执行漏洞. 二.漏洞复 ...

  9. 测试常用的sql语句

    1.查询:select * from table_name where 条件语句; SELECT * from sms_runwater WHERE message LIKE "%自有支付% ...

  10. (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅

    字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...