17.Swift学习之类

类的介绍和定义

  • Swift虽然推荐面向协议编程,但其也是一门面向对象开发的语言
  • 面向对象的基础是类,类产生了对象
  • 在Swift中如何定义类呢? Swift中用class关键字定义类

定义语法

class 类名  {
    // 定义属性和方法
}
  • 举例
  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 ,因为它是一个可选型

类的实例

  • 需要借助构造函数,结构体一样,在名称后面加一个()
let someVideoMode = VideoMode()

访问属性

  • 可以用点语法来访问一个实例的属性
print("The width of someResolution is \(someVideoMode.interlaced)")
  • 对于复合类型的属性,可以一直通过.下去来访问子属性
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
  • 赋值给一个属性
someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")

类是引用类型

  • 不同于值类型,在引用类型被赋值到一个常量,变量或者本身被传递到一个函数的时候它是不会被拷贝的,而使用的是同一个对某个实例的引用。
//定义一个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提供了两个特点运算符来检查两个常量或者变量是否引用相同的实例。
    • 相同于 ( ===)
    • 不相同于( !==)
if tenEighty === alsoTenEighty {
    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}

继承

  • 一个类可以从另一个类继承方法、属性和其他的特性。当一个类从另一个类继承的时,继承的类就是子类,被继承的就是父类
  • 定义一个父类
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
       
    }
}
  • 定义一个子类
class Bicycle: Vehicle {
    var hasBasket = false
}

重写

  • 所谓重写就是子类可以对继承自父类实例方法、类型方法、实例属性,类型属性进行覆盖
  • 重写需要在前面加上 override 关键字
  • override 关键字执行时Swift 编译器会检查重写的类的父类(或者父类的父类)是否有与之匹配的声明来提供重写
class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}
  • 防止被重写
    • 可以通过标记阻止这种行为:final var , final func , final class func

类与结构体的对比

  • 相同点
    • 定义属性
    • 定义方法
    • 定义初始化器
    • 可以被扩展
    • 遵循协议
  • 类有而结构体没有的额外功能
    • 继承
    • 类型转换
    • 析构
    • 引用计数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

数组与指针

一、数组        数组是由类型名、标识符和维数组成的复合数据类型,类型名规定了存放在数组中的元素类型,维数则指定数组中包含的元素个数。        数组...

21880
来自专栏柠檬先生

Python 基础 高阶函数

python 把函数作为参数   如果传入abs 作为参数     def add(x,y,y):       return f(x) + f(y)     a...

31990
来自专栏码云1024

JAVA 第二天 关键字

30270
来自专栏曾大稳的博客

c语法进阶

不管是基本数据类型还是结构体,c都是值传递,和java不同的是,java基本数据类型是值传递,对象是引用传递。所以在c当中一般都是指针传递

17820
来自专栏JavaEdge

Java中正则表达式PatternMatcherStringJava String.split()用法小结

32850
来自专栏深度学习计算机视觉

java正则表达式详解

正则表达式用于指定字符串的模式,你可以任何需要定位使用匹配某种特定模式的字符串的情况下使用正则表达式 jdk1.4推出java.util.regex包,就为我们...

29340
来自专栏数据结构与算法

13:将字符串中的小写字母转换成大写字母

13:将字符串中的小写字母转换成大写字母 总时间限制: 1000ms 内存限制: 65536kB描述 给定一个字符串,将其中所有的小写字母转换成大写字母。 ...

38640
来自专栏前端知识分享

第203天:js---Array对象常用方法

10220
来自专栏赵俊的Java专栏

合并排序数组

32910
来自专栏xiaoxi666的专栏

【模板小程序】2~62位非负数任意进制转换

  对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最后再将负号补回来,我认为这种做法是不对的。

11020

扫码关注云+社区

领取腾讯云代金券