# Swift 拓展和泛型
## Swift 拓展 Extension
### 擴展計算型屬性和便利構造函數
```
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()
init (origin: Point, size: Size) {
self.origin = origin
self.size = size
}
}
// 拓展 Rectangle
extension Rectangle {
func translate(x: Double,y: Double) {
self.origin.x += x
self.origin.y += y
}
}
let rect = Rectangle(origin: Point(), size: Size(width: 4, height: 5))
rect.translate(x: 10, y: 10)
rect
// 擴展計算型屬性和擴展便利構造函數
extension Rectangle{
// var center: Point = Point() // 不允許擴展存儲型屬性
var center: Point {
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
}
}
// 擴展構造函數 - 擴展中加入構造函數必須是一個便利的 convenience 構造函數,使用 self.init() 的方式引用當前對象實例化的指定構造函數
convenience init(center: Point, size: Size){
let originX = center.x - size.width/2
let originY = center.y - size.height/2
self.init(origin: Point(x: originX, y: originY),size: size)
}
}
```
### 擴展嵌套枚舉
```
class UI{
enum Theme{
case DayMode
case NightMode
}
var fontColor: UIColor!
var backgroundColor: UIColor!
var themeMode: Theme = .DayMode{
didSet{
self.changeTheme(themeMode: self.themeMode)
}
}
init(){
self.themeMode = .DayMode
self.changeTheme(themeMode: self.themeMode)
}
init(themeMode: Theme){
self.themeMode = themeMode
self.changeTheme(themeMode: themeMode)
}
func changeTheme( themeMode: Theme ){
switch(themeMode){
case .DayMode:
fontColor = UIColor.black
backgroundColor = UIColor.white
case .NightMode:
fontColor = UIColor.white
backgroundColor = UIColor.black
}
}
}
let ui = UI()
ui.themeMode
ui.fontColor
ui.backgroundColor
ui.themeMode = UI.Theme.NightMode
ui.themeMode
ui.fontColor
ui.backgroundColor
```
### 使用 extension 擴展系統類庫
```
extension Int{
// 計算平方
var square: Int{
return self * self
}
// 計算立方
var cube: Int{
return self * self * self
}
// 擴展方法 判斷整型是否在前閉后開的范圍內
func inRange(closedLeft left: Int, opendRight right: Int) -> Bool {
return self >= left && self < right
}
// 擴展方法
func repetitions( task: () -> Void ){
for _ in 0 ..< self {
task()
}
}
}
let num = 8
num.square // 64
num.cube // 512
let index = 10
index.inRange(closedLeft: 0, opendRight: 20) // 判斷 index 是否在 0 ..< 20
num.repetitions{
print("Hello,Swift!")
}
```
## Swift 泛型 Generic
泛型:是指有一套通用的邏輯,不與類型相關。例如交換兩個參數的值,如下:
```
func swapTwoInt( _ a: inout Int , _ b: inout Int) {
(a,b) = (b,a)
}
var a: Int = 0
var b: Int = 6
swapTwoInt(&a, &b)
a
b
// 上述函數定義中,如果需求要交換兩個浮點數,那么我們又需要定義類似如下函數來適應變化。
func swapTwoDouble(_ a: inout Double , _ b: inout Double) {
(a,b) = (b,a)
}
```
> 以上函數不管是交換整型還是交換浮點型,都是給兩個遍歷交換相互的值。那我們可以通過泛型對這種需求做改進。
```
// generic function
func swapTwoThings<T>(_ a: inout T , _ b: inout T) {
(a,b) = (b,a)
}
var hello = "Hello"
var bye = "Bye"
swapTwoThings(&hello, &bye)
hello
bye
swapTwoThings(&a, &b)
a
b
swap(&a, &b) // Swift 中的一個泛型函數
```
> 使用泛型可以創建更加通用的函數。
### 泛型類型
泛型函數與泛型語法。
```
let arr:Array<Int> = Array<Int>()
let dict = Dictionary<String,Int>()
let set = Set<Float>()
// 創建自定義數據結構 棧(后進先出)
struct Stack<T>{
// 存儲棧的內容,數組類型
var items = [T]()
func isEmpty() -> Bool{
return items.count == 0
}
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T? {
guard !self.isEmpty() else {
return nil
}
return items.removeLast()
}
}
// 擴展 Stack
extension Stack{
func top() -> T? {
return items.last
}
func count() -> Int {
return items.count
}
}
var s = Stack<Int>() // 存儲Int類型的棧
s.push(item: 1)
s.push(item: 2)
s.pop() // 2
var ss = Stack<String>() // 聲明存儲String類型的棧
ss.top() // nil
// 兩個數據類型的泛型
struct Pair<T1,T2> { // 取不同的泛型類型名稱
var a: T1
var b: T2
}
var pair = Pair<Int,String>(a: 0 , b: "Hello") // 成功創建兩個數據類型的泛型
pair
```
- 學習筆記
- 基礎
- 基本類型之整型
- 基本類型之浮點型
- 基本類型之布爾類型以及簡單的 if 語句
- 基礎類型之元組
- 基本類型之其他
- 運算符
- 基礎運算符
- 比較運算符、邏輯運算符
- 三元運算符
- 范圍運算符for-in
- 邏輯控制
- 循環結構
- 選擇結構
- 字符串
- Character和Unicode
- String.index 和 range
- 可選型
- 容器類
- 數組初始化
- 數組基本操作
- 字典初始化
- 字典基本操作
- 集合初始化
- 集合基本操作
- 函數
- 閉包
- 枚舉
- 結構體
- 類
- 文檔注釋
- 屬性和方法
- 下標和運算符重載
- 拓展和泛型
- 協議
- 其他
- Swift 3.0 For 循環
- Swift 隨機數的生成
- IOS開發玩轉界面 UIKit
- UILable 文本顯示控件
- UIButton 簡單的交互控件
- UIImageView 圖片控件
- UISearchBar 搜索控件