//: Playground - noun: a place where people can play
import UIKit
// 適用場景一: 系統已有的類型無法滿足特定的需求
extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
}
var oneDouble: Double = 10.5.m
var twoDouble: Double = 120.45.km
extension Int {
var square: Int { return self * self }
var cube: Int { return self * self * self }
func inRange(closedLeft: Int, closedRight: Int) -> Bool {
return self >= closedLeft && self <= closedRight
}
func repeatitions(task: () -> Void) {
for _ in 0..<self {
task()
}
}
}
var imInt: Int = 5
imInt.cube
// imInt.repeatitions()
// 適用場景二:
//class CustomViewController: UIViewController {
//
//}
//extension CustomViewController: UITableViewDataSource {
//
//}
//extension CustomViewController: UITableViewDelegate {
//
//}
Day07
回顧:
1. 類的聲明和初始化
public class ClassName {
各種屬性
構造方法
自定義方法
}
2. 存儲屬性; 存儲屬性觀察器
var propertyName: String {
willSet(customValue) {
}
didSet(customOldValue) {
}
}
3. 計算型屬性: 通過複雜計算/通過其他的屬性結合計算
var propertyName: String {
get {
return xxxx
}
set(customNewValue) {
}
}
4. 類型屬性: 作用類型(結構體/類)
—> 屬性的值是不依賴於實例化對象
static var typePropertyName: Int = 0
TypeName. typePropertyName
5. 延遲存儲屬性: 沒有屬性觀察器語法
—> 耗時 + 依賴於其他屬性初始化的值 + 只計算一次
lazy var propertyName: Int = {
// 業務邏輯
return xxxxx
}()
今天內容:
· 訪問權限
· 類型轉換Type Casting
· 協議
訪問權限Access Control: 可以設定代碼在某個文件內/模塊內可見或者不可見; 隱藏代碼的實現細節, 使得部分屬性/接口可訪問
1. 針對對象: 類/結構體/枚舉中的屬性/自定義方法/構造方法
2. 某個文件內/模塊Module內:
a. 模塊和Xcode等價描述: Framework; Target/app/Bundle
b. 文件內和Xcode等價描述: 以.swift結尾的文件
3. 常用的四種權限設置:
public: 公開的; 可以被模塊外訪問(SDK開發)
internal: 內部的; 默認設置的值; 可以被本模塊內訪問
fileprivate: 文件內私有; 只可以被文件內訪問
private: 私有; 只可以在該類型內方法
4. 樣例: 類的訪問權限的實現
[ 01_access_control ]
—> 一般設置權限的原則: 權限從小到大
a. 先把所有的類型都設置private(文件內可見)
b. 再把哪些訪問的屬性/方法設置爲internal, 或者public
—> 查看01_access_control的包的內容:
a. Contents.swift: 內容文件
b. playground是一個工作空間

—> Sources: swift文件
—> Resources: 圖片/配置文件......

—> 在創建文件之後, 效果圖
a. Sources整個文件夾認爲一個target
b. Contents.swift認爲另一個target

/05_Swift/Day07/Day07-AM1.zip
5. 類型查看和類型轉換
5.1. 類型查看運算符(Type Check Operator):
—> 描述: 查看某個實例常量/變量是否是那個類型; 是否是該類子類的實例對象;
-> 關鍵詞: is
5.2. 類型轉換運算符(Type Casting Operator):
-> 描述: 對某個實例對象進行類型換(as?返回該類型的可選型; as!進行強制類型轉換)
-> 關鍵詞: as! / as?
6.Any和AnyObject類型:
6.1 AnyObject: 描述任意類類型(Class Type)的實例對象
6.2 Any: 描述任意類型(類/結構體/枚舉/函數類型)的實例對象
7. 樣例(******): 類型查看和類型轉換; Any / AnyObject
[ 02_type_check_casting ]
—> 總結:
a. is是還是不是
b. as! as? 是否可以轉
c. switch語句和as/is結合
d. Any / AnyObject區分
/05_Swift/Day07/Day07-AM2.zip
————————— 下午內容 ———————
協議Protocol
1. 基本的協議的聲明和使用
1.1 對象: 枚舉 / 結構體 / 類
1.2 協議和OC一樣, 也可以繼承
1.3 內容: 添加屬性(只讀/可讀可寫)和方法(init/自定義)
1.4 樣例: 枚舉 / 結構體 / 類如何遵循自定義協議
[ 03_basic_protocol ]
2. 適用場景
2.1 樣例: 實現下面流程圖
[ 04_other_protocol ]

/05_Swift/Day07/Day07-PM1.zip
擴展Extention
1. 描述: 對已存在的類型(枚舉/結構體/類)添加屬性和方法機制
2. 樣例: 對系統已存在的結構體添加擴展, 對自定義的類添加擴展
[ 05_extention ]
3. Swift解析JSON格式數據樣例URL:
http://api.openweathermap.org/data/2.5/weather?q=Barcelona,es&appid=ac02dc102cc17b974cd84206048d97d8
3.1 原生NSURLSession類獲取JSON步驟:
a. NSURLSession單例對象(如果設置session, 和URLSessionConfiguration結合)
b. 創建Request對象(給定URL)
c. 創建task任務對象(dataTask/downloadTask/uploadTask)
d. 執行task(發送請求)
e. 處理服務器的返回(completionHandler; delegate方法)
3.2 樣例: 實現上面的步驟(沒有使用MVC)
[ 06_json_parse ]
—> 總結:
a. 服務器返回的三個類型的數據都是可選型
b. JSON對象轉Foundation對象是Any?(數組/字典)
c. 從數組和字典取值也都是Any?
3.3 課堂練習: 解析如下key的value
a. 經緯度值: lon和lat

b. “main”的Clear值

dataTask和downloadTask區別?
1. dataTask: 客戶端請求, 服務器返回的數據以NSData類型返回(內存中)
2. downloadTask: 客戶端請求, 服務器返回的數據直接存到沙盒內(磁盤中)
Day07知識點總結:
1. 掌握訪問權限設定(public/internal/fileprivate/private)
2. 掌握類型判斷和類型轉換(is/as/as!/as?)
3. 掌握自定義協議的創建和遵循語法
Swift 系統學習 31 擴展 extension
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.