方法(学习笔记)

环境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. Java线程池的增长过程

    通过ThreadPoolExecutor的方式创建线程池 ThreadPoolExecutor 构造方法: public ThreadPoolExecutor(int corePoolSize, in ...

  2. python虚拟环境完美部署

    一.前言 预处理 建议仔细看完本文章之后在进行操作,避免失误,本环境可以用于生产环境,有利于生产环境python之间的环境隔离,互相不会产生环境冲突:pyenv和pyenv-virtualenv可以完 ...

  3. 0R电阻在PCB布线中对布线畅通的一个小妙用

    在PCB布线中,我们都会尽量节约板子空间,将元器件排布的紧密一些,难免会遇到布线不通的时候. 博主下面就来说一个关于0R电阻在PCB布线使之畅通的一个小妙用. 使用0R电阻前 假设我们这个TXD的线周 ...

  4. 闯荡Ext-第一篇

    今天在网上找到了一本非常好的书:<Ext江湖>,这本书是由大漠穷秋大神写的,刚看到这本书的时候,心里面的那个激动劲啊,本来原先的时候心里面就一直念叨着想要学习Ext,但是苦于找不到好的资料 ...

  5. 【Java例题】1.3给朋友的贺卡

    3.对“Hello World”程序进行改造, 能够显示一张发给朋友的贺卡.格式如下: ****************************** 张三,你好! 祝你学习愉快! 你的好朋友:李四 2 ...

  6. 【JDK】JDK源码分析-CyclicBarrier

    概述 CyclicBarrier 是并发包中的一个工具类,它的典型应用场景为:几个线程执行完任务后,执行另一个线程(回调函数,可选),然后继续下一轮,如此往复. 打个通俗的比方,可以把 CyclicB ...

  7. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

  8. [Spring cloud 一步步实现广告系统] 16. 增量索引实现以及投送数据到MQ(kafka)

    实现增量数据索引 上一节中,我们为实现增量索引的加载做了充足的准备,使用到mysql-binlog-connector-java 开源组件来实现MySQL 的binlog监听,关于binlog的相关知 ...

  9. 完整原型链详细图解之JS构造函数、原型 原型链、实例化对象

    一.首先说一下什么是构造函数: 构造函数:用来在创建对象时初始化对象.特点:构造函数名一般为大写字母开头:与new运算符一起使用来实例化对象. 举例: function Person(){} //Pe ...

  10. 转载 | Sublime text3 实用快捷键整理

    实用快捷键 Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+ ...