前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >17.Swift学习之类

17.Swift学习之类

作者头像
YungFan
发布2018-11-07 11:23:42
5890
发布2018-11-07 11:23:42
举报
文章被收录于专栏:学海无涯学海无涯
类的介绍和定义
  • Swift虽然推荐面向协议编程,但其也是一门面向对象开发的语言
  • 面向对象的基础是类,类产生了对象
  • 在Swift中如何定义类呢? Swift中用class关键字定义类
定义语法
代码语言:javascript
复制
class 类名  {
    // 定义属性和方法
}
  • 举例
代码语言:javascript
复制
  class VideoMode {
      var resolution = Resolution()
      var interlaced = false
      var frameRate = 0.0
      var name: String?
  }
  • 解读
    • 定义了一个名叫 VideoMode的类
    • 这个类有四个变量存储属性
      • resolution,用 Resolution结构体实例来初始化,它使属性的类型被推断为 Resolution。
      • interlaced为 false
      • frameRate为 0.0
      • name属性会自动被赋予一个空值 nil ,因为它是一个可选型
类的实例
  • 需要借助构造函数,结构体一样,在名称后面加一个()
代码语言:javascript
复制
let someVideoMode = VideoMode()
访问属性
  • 可以用点语法来访问一个实例的属性
代码语言:javascript
复制
print("The width of someResolution is \(someVideoMode.interlaced)")
  • 对于复合类型的属性,可以一直通过.下去来访问子属性
代码语言:javascript
复制
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
  • 赋值给一个属性
代码语言:javascript
复制
someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
类是引用类型
  • 不同于值类型,在引用类型被赋值到一个常量,变量或者本身被传递到一个函数的时候它是不会被拷贝的,而使用的是同一个对某个实例的引用。
代码语言:javascript
复制
//定义一个VideoMode类的对象
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

//定义一个常量等于上面的类的对象
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

//同时改变
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
特征运算符
  • 因为类是引用类型,可能有很多常量和变量都是引用到了同一个类的实例。有时候找出两个常量或者变量是否引用自同一个类实例非常有用,Swift提供了两个特点运算符来检查两个常量或者变量是否引用相同的实例。
    • 相同于 ( ===)
    • 不相同于( !==)
代码语言:javascript
复制
if tenEighty === alsoTenEighty {
    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
继承
  • 一个类可以从另一个类继承方法、属性和其他的特性。当一个类从另一个类继承的时,继承的类就是子类,被继承的就是父类
  • 定义一个父类
代码语言:javascript
复制
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
       
    }
}
  • 定义一个子类
代码语言:javascript
复制
class Bicycle: Vehicle {
    var hasBasket = false
}
重写
  • 所谓重写就是子类可以对继承自父类实例方法、类型方法、实例属性,类型属性进行覆盖
  • 重写需要在前面加上 override 关键字
  • override 关键字执行时Swift 编译器会检查重写的类的父类(或者父类的父类)是否有与之匹配的声明来提供重写
代码语言:javascript
复制
class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}
  • 防止被重写
    • 可以通过标记阻止这种行为:final var , final func , final class func
类与结构体的对比
  • 相同点
    • 定义属性
    • 定义方法
    • 定义初始化器
    • 可以被扩展
    • 遵循协议
  • 类有而结构体没有的额外功能
    • 继承
    • 类型转换
    • 析构
    • 引用计数
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.10.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类的介绍和定义
  • 定义语法
  • 类的实例
  • 访问属性
  • 类是引用类型
  • 特征运算符
  • 继承
  • 重写
  • 类与结构体的对比
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档