在Swift中,類和結構體是通用且靈活的架構,枚舉是一組相關的值的集合,并允許你在代碼中使用它們。你可以在類和結構體中添加屬性和方法,如常量、變量和函數。
相對于其他編程語言,當你想創建類和結構體時,需要創建接口文件和實現文件。Swift不需要你創建接口文件和實現文件,如玩過OC的朋友都知道.h和.m文件。在Swift中,當你想創建類和結構體時,只需要創建一個文件。這個類和結構的外部接口可自動給其他代碼使用。
## 比較類和結構體
類和結構體有很多共同點:
- 為存儲值聲明屬性;
- 定義函數的方法;
- 定義下標并支持下標語法;
- 為屬性設置初始值;
- 可擴展;
- 為子類提供規范。
類支持的功能而結構體不支持的功能有:
- 可繼承,使一個類繼承另一個類的特性;
- 在運行過程中,可轉換類型;
- 在類銷毀時釋放資源;
- 引用計數運行多個引用到同一個類實例。
### 定義語法
類和結構體的定義語法是相似的,只是定義類用的關鍵字是class,定義結構體的關鍵字是struct。下面定義了一個空的類和結構體:
~~~
class SomeClass {
}
struct SomeStructure {
}
~~~
這里定義了有屬性的類和結構體:
~~~
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
~~~
可以看出,在類VideoMode中resolution指向一個結構體,name是一個可為nil或String類型的數據,其他屬性都指定了默認值。
### 類和結構體初始化
~~~
let someResolution = Resolution()
let someVideoMode = VideoMode()
~~~
### 訪問屬性
訪問類和結構體的屬性可以使用點語法。
~~~
print("someResolution.width:\(someResolution.width)") // 0
print("someVideoMode.resolution.width:\(someVideoMode.resolution.width)") // 0
~~~
你還可以通過點語法改變類或結構體中的數據。
~~~
someVideoMode.resolution.width = 1280
print("someVideoMode.resolution.width:\(someVideoMode.resolution.width)") // 1024
~~~
### 通過成員初始化結構體
我們可以通過結構體的成員初始化結構體。這能幫我們快速初始化結構體,但是,初始化的過程必須全部成員一起初始化。
~~~
let vga = Resolution(width: 640, height: 480)
~~~
## 結構體和枚舉是值類型
什么是值類型?值類型是一個值,當它分配給一個常量、變量或被作為參數傳遞時,它的值是被復制的。
~~~
// 結構體測試
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048 // 改變cinema的值,不會改變hd中的值
print("cinema.width:\(cinema.width)") // 2048
print("hd.width:\(hd.width)") // 1920
~~~
從上面的例子中可以看出,當你改變cinema的width值,不會引起hd中width的變化。
下面再用枚舉舉例:
~~~
// 枚舉測試
enum CompassPoint {
case North, South, East, West
}
var currentDirection = CompassPoint.West
let rememberedDirection = currentDirection
// 改變currentDirection,rememberedDirection的值不會變化
currentDirection = .East
print("\(rememberedDirection)") // West
~~~
## 類是引用對象
相當于值對象,引用對象在傳遞過程中是不會復制的,它們指向同一個實例。
~~~
let tenEighty = VideoMode()
tenEighty.frameRate = 25.0
// 引用tenEighty到alsoTenEighty,并改變alsoTenEighty中的值
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print("tenEighty.frameRate:\(tenEighty.frameRate)") // 30
~~~
在這里修改alsoTenEighty的frameRate會發現tenEighty的frameRate值也發生變化。
## 恒等算子
因為類是引用類型,它可能被多個常量或變量指向。我們需要一種機制判斷這些常量或變量是否指向同一個實例。這里就需要用到恒等算子。
在swift中恒等算子有兩種操作符:
- ===:相同實例
- !==:不同實例
使用這些操作符來比較兩個常量或變量是否引用同一個實例:
~~~
// 恒等算子是===或!==
let tenEighty = VideoMode()
let alsoTenEighty = tenEighty
if tenEighty === alsoTenEighty {
print("相同實例")
}
~~~
## 其他
### 參考資料
[The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)
### 文檔修改記錄
| 時間 | 描述 |
|-----|-----|
| 2015-10-28 | 根據 [The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)中的Classes and Structures總結 |
版權所有:[http://blog.csdn.net/y550918116j](http://blog.csdn.net/y550918116j)
- 前言
- Swift函數
- Swift閉包(Closures)
- Swift枚舉(Enumerations)
- Swift類和結構體(Classes and Structures)
- Swift屬性(Properties)
- Swift方法(Methods)
- Swift下標(Subscripts)
- Swift繼承(Inheritance)
- Swift初始化(Initialization)
- Swift銷毀(Deinitialization)
- Swift可選鏈(Optional Chaining)
- Swift錯誤處理(Error Handling)
- Swift類型選擇(Type Casting)
- Swift協議(Protocols)
- Swift訪問控制(Access Control)
- Swift高級運算符(Advanced Operators)