方法(学习笔记)

环境Xcode 11.0 beta4 swift 5.1

  • 方法

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

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

      class Counter {
      var count = 0
      func increment() {
      count += 1
      }
      func increment(by amount: Int) {
      count += amount
      }
      func reset() {
      count = 0
      }
      }
      let counter = Counter()
      // the initial counter value is 0
      counter.increment()
      // the counter's value is now 1
      counter.increment(by: 5)
      // the counter's value is now 6
      counter.reset()
      // the counter's value is now 0
    • self 属性,每个类型的实例都有的隐式的属性

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

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

      // 上面的Point可以写成下面的形式
      struct Point {
      var x = 0.0, y = 0.0
      mutating func moveBy(x deltaX: Double, y deltaY: Double) {
      self = Point(x: x + deltaX, y: y + deltaY)
      }
      }
      // 枚举的可变方法
      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
  • 类型方法

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

      class SomeClass {
      class func someTypeMethod() {
      // type method implementation goes here
      }
      }
      SomeClass.someTypeMethod()
      struct LevelTracker {
      static var highestUnlockedLevel = 1
      var currentLevel = 1
      //
      static func unlock(_ level: Int) {
      if level > highestUnlockedLevel { highestUnlockedLevel = level }
      }
      //
      static func isUnlocked(_ level: Int) -> Bool {
      return level <= highestUnlockedLevel
      }
      //
      @discardableResult
      mutating func advance(to level: Int) -> Bool {
      if LevelTracker.isUnlocked(level) {
      currentLevel = level
      return true
      } else {
      return false
      }
      }
      }
      class Player {
      var tracker = LevelTracker()
      let playerName: String
      func complete(level: Int) {
      LevelTracker.unlock(level + 1)
      tracker.advance(to: level + 1)
      }
      init(name: String) {
      playerName = name
      }
      }
      var player = Player(name: "Argyrios")
      player.complete(level: 1)
      print("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)")
      // Prints "highest unlocked level is now 2"
      // 创建一个新的player
      player = Player(name: "Beto")
      if player.tracker.advance(to: 6) {
      print("player is now on level 6")
      } else {
      print("level 6 has not yet been unlocked")
      }
      // 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. Oracle GoldenGate mysql To Kafka上车记录

    一.前言 首先要学习一下ogg的所有进程,看着这张图来学习   Manager进程是GoldenGate的控制进程,运行在源端和目标端上.它主要作用有以下几个方面:启动.监控.重启Goldengate ...

  2. eclipse解决properties文件中文乱码(两种方试)

    第一种:大多数网上搜到的情况(不靠谱) 第一步:windows-->properties-->General-->Content Types-->text(如下图) 第二步:p ...

  3. C++学习想法

    今天是周一,今天做早操的时候舍友说准备买一本C++基础的书.我觉得这样的想法很好,突然想到自己最近几天因为自己私人原因事情很忙,蛋这不能成为我不学C++的理由.所以我在这规划了我这一周的学习进程.首先 ...

  4. Spring AOP JDK动态代理与CGLib动态代理区别

    静态代理与动态代理 静态代理 代理模式 (1)代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. (2)静态代理由 业务实现类.业务代理类 两部分 ...

  5. C#读取Txt大数据并更新到数据库

    环境 Sqlserver 2016 .net 4.5.2 目前测试数据1300万 大约3-4分钟.(限制一次读取条数 和 线程数是 要节省服务器资源,如果调太大服务器其它应用可能就跑不了了), Sql ...

  6. spring-boot-plus项目目录结构(六)

    spring-boot-plus项目目录结构 目录结构 bin:启动/重启命令脚本目录 logs:部署后记录日志目录 assembly:maven打包配置文件目录 java:源代码目录 resourc ...

  7. Unity经典案例之:Fire Balls 多个圆环以及圆环的变速变向

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  8. BUPTOJj83

    83. A + B Problem 时间限制 1000 ms 内存限制 65536 KB 题目描述 Calculate the sum of two given integers A and B. 输 ...

  9. Springboot源码分析之EnableAspectJAutoProxy

    摘要: Spring Framwork的两大核心技术就是IOC和AOP,AOP在Spring的产品线中有着大量的应用.如果说反射是你通向高级的基础,那么代理就是你站稳高级的底气.AOP的本质也就是大家 ...

  10. 重新学习MySQL数据库开篇:数据库的前世今生

    本文内容出自刘欣的"码农翻身"公众号,强烈推荐刘欣大大的文章.   数据库的前世今生 小李的数据库之旅 无纸化办公 小李是这个大学计算机科学与技术系的知名学生,他的编程能力了得,使 ...