Swift 4 Classes

类和结构体很像,同样是自定义类型,同样可以在内部定义属性和方法。我们知道结构体是值类型,而类是引用类型。实际使用时,我们用结构体来代表值,而用类来表示对象。

创建类

class Person {
  var firstName: String
  var lastName: String

  init(firstName: String, lastName: String) {
    self.firstName = firstName
    self.lastName = lastName
  }

  var fullName: String {
    return "\(firstName) \(lastName)"
  }
}

let john = Person(firstName: "Johnny", lastName: "Appleseed")

我们可以看到类的定义和结构体几乎一样,一个是struct关键字,一个是class而已。
但是,我们细心点可以发现,类是必须要自己实现构造方法的,而不像结构体(系统默认为结构体提供了构造方法)。如果我们没有为类提供构造方法,编译阶段就会报错。

引用类型(Reference types)

在Swift中,结构体的实例是不可变的值,类的实例变量是可变的。因为类的引用只是指向内存区域的指针而已。

When you create a reference type such as class, the system stores the actual instance in a region of memory known as the heap. Instances of a value type such as a struct resides in a region of memory called the stack, unless the value is part of a class instance, in which case the value is stored on the heap with the rest of the class instance.

当创建一个引用类型(如类)时,系统将实际实例存储在一个称为堆的内存区域中。值类型(例如结构)的实例驻留在一个称为堆栈的内存区域中,除非该值是类实例的一部分,在这种情况下,该值与堆实例的其余部分一起存储在堆中。

对象之间的比较(Object identity)

john === homeOwner // true

Swift使用‘===’来比较两个引用是否相等。其实比较的就是两个引用所指向的堆地址是否相同。

下面我们看个例子来详细说明可变和不可变的区别:

struct Grade {
  let letter: String
  let points: Double
  let credits: Double
}

class Student {
  var firstName: String
  var lastName: String
  var grades: [Grade] = []

  init(firstName: String, lastName: String) {
    self.firstName = firstName
    self.lastName = lastName
  }

  func recordGrade(_ grade: Grade) {
    grades.append(grade)
  }
}

let jane = Student(firstName: "Jane", lastName: "Appleseed")
let history = Grade(letter: "B", points: 9.0, credits: 3.0)
var math = Grade(letter: "A", points: 16.0, credits: 4.0)

jane.recordGrade(history)
jane.recordGrade(math)

上面的代码我们可以发现,recordGrade方法正在修改实例的内容,但是我们并没有使用mutating来修饰这个方法。mutating标记这个方法会修改当前实例的值为新值。但是,在类中我们无需这么做,因为累的实例本身就是可变的。

类扩展

和结构体一样,我们同样可以为类扩展计算属性和方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,259评论 19 139
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,910评论 2 9
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,008评论 0 38
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,856评论 0 9
  • 爱一个人就是,他开心,你也开心,他不开心,你也不开心!
    笨丫头潮流衣馆阅读 179评论 0 0