• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift从入门到精通第五篇 - 结构体-类 初识

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

结构体-类 初识(学习笔记)

环境Xcode 11.0 beta4 swift 5.1

  • 类和结构体的共同点

    • 可以定义属性
    • 可以定义方法
    • 可以用下标语法去访问(见下面的示例代码)
    • 定义初始化器
    • 可以通过扩展扩展其功能,使其超出默认实现
    • 遵守协议以提供其它标准功能
      struct Matrix {
          let rows: Int, columns: Int
          var grid: [Double]
          init(rows: Int, columns: Int) {
              self.rows = rows
              self.columns = columns
              grid = Array(repeating: 0.0, count: rows * columns)
          }
          func indexIsValid(row: Int, column: Int) -> Bool {
              return row >= 0 && row < rows && column >= 0 && column < columns
          }
          subscript(row: Int, column: Int) -> Double {
              get {
                  assert(indexIsValid(row: row, column: column), "Index out of range")
                  return grid[(row * columns) + column]
              }
              set {
                  assert(indexIsValid(row: row, column: column), "Index out of range")
                  grid[(row * columns) + column] = newValue
              }
          }
      }
      // 初始化一个矩阵变量
      var matrix = Matrix(rows: 2, columns: 2)
      // 可以在下图1看到初始化后的结果
      // 通过subscript语法改变值
      matrix[0, 1] = 1.5
      matrix[1, 0] = 3.2
      // 结果是下图2
      

  • 类特有的功能

    • 可以继承,使一个类能够继承另一个类的特征。
    • 类型转换,能够在运行时检查和解释类实例的类型。
    • 反初始化器,类的实例能够释放它所分配的任何资源。
    • 引用计数允许对类实例的多个引用
  • 结构体(Structure)

    • 结构体是值类型(见下图)

      struct Resolution {
        var width = 0
        var height = 0
      }
      let someResolution = Resolution()
      let hd = Resolution(width: 1920, height: 1080)
      var cinema = hd
      cinema.width = 2048
      print("cinema is now \(cinema.width) pixels wide")
      // Prints "cinema is now 2048 pixels wide"
      print("hd is still \(hd.width) pixels wide")
      // Prints "hd is still 1920 pixels wide"
      // 见下图
      

    • 所有的结构体都有一个编译器自动生成的初始化器,主要是要保证所有成员都有初始值

    • 如果自定义了初始化器,编译器就不会自动生成初始化器

      // 可以尝试以下代码,检查以下代码的正确性
      // 例一
      struct Point {
      	var x: Int = 0
      	var y: Int = 0
      }
      var p1 = Point(x: 1, y: 1)
      var p2 = Point(x: 1)
      var p3 = Point(y: 1)
      var p4 = Point()
      // 例二
      struct Point {
      	var x: Int = 0
      	var y: Int
      }
      var p1 = Point(x: 1, y: 1)
      var p2 = Point(x: 1)
      var p3 = Point(y: 1)
      var p4 = Point()
      // 例三
      struct Point {
      	var x: Int?
      	var y: Int?
      }
      var p1 = Point(x: 1, y: 1)
      var p2 = Point(x: 1)
      var p3 = Point(y: 1)
      var p4 = Point()
      
  • 类(Class)

    • 类是引用类型(见下图)

      class VideoMode {
          var resolution = Resolution()
          var interlaced = false
          var frameRate = 0.0
          var name: String?
      }
      let tenEighty = VideoMode()
      tenEighty.resolution = hd
      tenEighty.interlaced = true
      tenEighty.name = "1080i"
      tenEighty.frameRate = 25.0
      let alsoTenEighty = tenEighty
      alsoTenEighty.frameRate = 30.0
      // 见下图
      // (不)恒等运算符 === 和 !==,这两个符号的功能是:找出两个常量或变量是否引用了一个类的完全相同的实例
      if tenEighty === alsoTenEighty {
        	print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
      }
      // Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
      

    • 编译器不会为类自动生成传入成员值的初始化器,如果类里的成员值没有初始化,器编译器连无参的初始化也不会自动生成

      // 尝试以下代码,看是否有自动生成初始化器
      class Point {
          var x: Int = 1
          var y: Int = 1
      }
      var p1 = Point(x: 2, y: 2) // false
      var p2 = Point(x: 2) // false
      var p3 = Point(y: 2) // false
      var p4 = Point() // true
      

[Swift从入门到精通]


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
swift 分享share页面封装(功能按钮不同)发布时间:2022-07-14
下一篇:
Swift从入门到精通第八篇 - 方法 初识发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap