对照Java学习Swift--类和结构体(Classes and Structures)

时间:2021-08-17 15:39:48

这一点上Java跟Swift不一样,Java中以类为主体,所有的代码都有写在类中,Swift可以写在外面,Java中干脆就舍去了结构体这个概念,Swift中依然保留了结构体,而且Swift大量的基本类型都是由结构体来实现的,比如String,Array和Dictionary类型均以结构体的形式实现的,这些基础类型都是值类型,在传递的过程中都是复制的,类是引用类型,在传递的过程中只复制引用,引用所指向的对象是不复制的。

定义语法

class SomeClass {
// class definition goes here
}
struct SomeStructure {
// structure definition goes here
}

这个类的定义跟Java差不多。
例如:

struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}

类和结构体实例

let someResolution = Resolution()
let someVideoMode = VideoMode()

这个跟Java有点不同,少了new关键字。

属性访问

通过使用点语法(dot syntax),你可以访问实例的属性。其语法规则是,实例名后面紧跟属性名,两者通过点号(.)连接:
例如:

someResolution.width
someVideoMode.resolution.width
someVideoMode.resolution.width = 100

这个在Java中虽然也可以,但是不规范,Java中,不叫属性,叫字段,为每个字段写个set,get方法来访问,而不是只用点来访问。

结构体类型的成员逐一构造器(Memberwise Initializers for Structure Types)

所有结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一构造器之中:

let vga = Resolution(width:640, height: 480)

但是类却没有逐一构造器,这个要注意。

值类型与引用类型

结构体和枚举是值类型,类是引用类型,这个要注意。
要判断多个常量和变量在幕后同时引用同一个类实例,我们用恒等运算符:

  • 等价于(===)
  • 不等价于(!==)

但是不能用来比较值类型,会发生语法错误,值类型是不能用恒等运算符来比较的。
还有一个等于(==)符号,是用来比较两个实例是否相等,这与逻辑有关了,这里我举个例子,比如,有个Person类,其中有个IDCard字段,代表身份证,有两个实例,!==为true,即不是同一个实例,假如我们定义了一个逻辑,如果两个人,如果他的IDCard一样,我们就认为是同一个人,这个时候如果两个实例的IDCard一样,那么这两个实例的==操作将返回true,即相等,但是===操作则返回false,大家注意,后面会遇到。