## CLASSES
通过 class 关键字定义一个类:
~~~
class Person {
var clothes: String
var shoes: String
}
~~~
但是上面有个问题,Swift 不允许创建未被正确初始化的变量。解决方法有三种:
1. 将这两个变量定义为 Optional。(这会致使代码中出现大量不必要的 Optional 类型)
2. 给变量附上一个初始值。(这行得通,但这有点浪费,除非这个初始值一定会被使用)
3. 自己写一个初始化方法。(最佳)
通过创建一个 init() 方法来实现自定义初始化方法:
~~~
class Person {
var clothes: String
var shoes: String
init(clothes: String, shoes: String) {
self.clothes = clothes
self.shoes = shoes
//init方法不需要添加 func 关键字
}
}
~~~
实例化一个类:
~~~
var taylor = Person(name: "Taylor", age: 25)
~~~
继承一个类:
~~~
class Singer: Person {
}
~~~
在 Swift 中,想要在继承类(子类)中覆盖父类的方法,需要使用 override 关键字:
class Singer: Person { override func sing() { print(“Trucks, girls, and liquor”) } }
通过 super 关键字调用父类方法:
~~~
init(name: String, age: Int, noiseLevel: Int) {
self.noiseLevel = noiseLevel
super.init(name: name, age: age)
}
~~~
* 在 Swift 中,类和结构体有点相似,都可以拥有属性和方法,区别在于结构体是值拷贝,这意味着改变拷贝值不会改变原来的值,而类是指针拷贝,拷贝的变量会指向相同的实例,见下例:
~~~
// Value type example
struct S { var data: Int = -1 }
var a = S()
var b = a // a is copied to b
a.data = 42 // Changes a, not b
println("\(a.data), \(b.data)") // prints "42, -1"
// Reference type example
class C { var data: Int = -1 }
var x = C()
var y = x // x is copied to y
x.data = 42 // changes the instance referred to by x (and y)
println("\(x.data), \(y.data)") // prints "42, 42"
~~~