- 類的初探
class Person {
let firstName: String
let lastName: String
var career: String?
init(firstName: String, lastName: String, career: String) {
self.firstName = firstName
self.lastName = lastName
self.career = career
}
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
func fullName() -> String {
return firstName + " " + lastName
}
}
let person = Person(firstName: "qin", lastName: "zhen", career: "programmer")
person.fullName()
- 添加一個(gè)新的方法(方法可以改變對(duì)象的值)
func setNewCareer(newCareer: String) {
self.career = newCareer
}
//對(duì)于引用類型而言,變量的實(shí)例是一個(gè)常量的話冷离,依然可以修改定義在類中可變量的值,且可以通過(guò)方法直接修改實(shí)例本身
person.setNewCareer(newCareer: "freelancer") //不報(bào)錯(cuò)
- 引用類型對(duì)比值類型
// 方法前不加mutating關(guān)鍵字會(huì)報(bào)錯(cuò)
//類比結(jié)構(gòu)體
struct Location {
var x: Int = 0
var y: Int = 0
mutating func goEast(){
self.x += 1 //如果不加mutating則報(bào)錯(cuò)扬霜,x不可修改
}
}
var location = Location()
location.goEast()
//類比枚舉
enum Switch {
case On
case Off
mutating func click() {
switch self {
case .On:
self = .Off
case .Off:
self = .On
}
}
}
var button = Switch.Off
button.click()
- 引用類型的比較
let person1 = Person(firstName: "qin", lastName: "zhen", career: "programmer")
let person2 = person
//person2 == person1 //報(bào)錯(cuò)
person2 === person1 //true芬膝,判斷兩個(gè)對(duì)象是否指向同一塊內(nèi)存空間,符號(hào)適用于引用類型
let person3 = Person(firstName: "qin", lastName: "zhen", career: "programmer")
person3 === person1 //false篮迎,person1和person3分別指向兩塊不同的內(nèi)存空間
person3 !== person1 //true
男图。
- 什么時(shí)候用結(jié)構(gòu)體示姿,什么時(shí)候用類
- 把結(jié)構(gòu)看作是值:位置(經(jīng)緯度)甜橱,坐標(biāo)(二維、三維坐標(biāo))栈戳,溫度等(棧)
- 把類看作是物體:人、車、商品瘟裸、動(dòng)物等 (堆)
- 計(jì)算型屬性
struct Point {
var x = 0.0
var y = 0.0
}
struct Size {
var width = 0.0
var height = 0.0
}
class Rectangle {
var origin = Point()
var size = Size()
//計(jì)算型屬性必須聲明為var
var center: Point {
// getter和setter方法
get {
let centerX = origin.x + size.width / 2
let centerY = origin.y + size.height / 2
return Point(x: centerX, y: centerY)
}
set {
origin.x = newValue.x - size.width / 2
origin.y = newValue.y - size.height / 2
}
}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
//如果只是取值,直接return即可
var area: Double {
return size.height * size.width
}
}
var rec = Rectangle(origin: Point(), size: Size(width: 10, height: 10))
//使用get方法獲取屬性值
rec.center
//使用set方法修改center坐標(biāo)
rec.center = Point()