1.swift Protocol
-
設定可選協議方法
-
需要遵守
NSObjectProtocol
協議 -
協議需要是
@objec
-
方法是需要@object optional
@objc protocol CircleDelegate:NSObjectProtocol { @objc optional func cirelcPrint() } 複製程式碼
-
定義delegate 屬性
weak var delegate:CircleDelegate?
-
呼叫代理方法
delegate?.cirelcPrint?()
-
-
protocol
mutating
關鍵字-
使用mutation 關鍵字來標記一個會修改結構體的剛發
-
class 中不需要使用mutating標記,因為類總方法通常可以修改類屬性
-
可以給系統方法增加寫extion,遵守代理
-
2.switchCase
-
case let x where x.hasSuffix("peper"): print("li it a spicy")
-
可以在case中使用where 進行判斷
3.元組
-
取元組可以根據屬性,也可以根據下標取
let amutule : (min:Int,max:Int,sum:Int) = (2,4,6) print(amutule.sum) print(amutule.2) 複製程式碼
4.函式的不確定引數個數
-
傳入一個不確定引數類別,計算和
func sumOfnumbers(numbers:Int...)->Int{ var sum = 0 for numbe in numbers { sum += numbe } return sum } print("\(sumOfnumbers(numbers: 2,3,4,5,5))") 複製程式碼
5.函式作為一個引數,傳入另一個函式中
-
一個函式傳入一個引數,一個判斷條件的函式引數,返回值是bool
-
在函式內部,傳引數1,呼叫函式引數判斷
6.函式作為返回值
-
函式作為返回值
-
適用的時候,生產函式型別的變數,呼叫變數(函式)方法
7.集合map
的使用
-
使用map 批量操作集合內的元素
-
匹配符合集合的元素批量處理,也可以進行判斷,不符合條件的為0
-
如果一個閉包的型別已知,並且作為回撥函式,可以忽略引數型別和返回值,單個閉包語句,會把它語句的值當作返回值返回
-
可以通過引數所在的位置,替代引數名來引用引數,在非常短的閉包中非常有用
8.setter 和getter
方法
-
在setter 中新值是newValue
-
可以在set 後面顯示設定一個別名
9.監測API 可用性
- 監測API 可用性 iOS 10
func textAPI(){ if #available(iOS 10, macOS 10.12,*) { // 在iOS 10使用,MacOS 10。12使用 }else{ // 使用先前的iOS,macOS的API } } 複製程式碼
10.swift 陣列
-
陣列的CRUD
var aArray = Array(repeating: 0.4, count: 3); //aArray.isEmpty //aArray.append(<#T##newElement: Double##Double#>) //aArray.insert(<#T##newElement: Double##Double#>, at: <#T##Int#>) //aArray.remove(at: <#T##Int#>) //aArray.removeLast() for (indx,value) in aArray.enumerated() { print("\(indx)----\(value)") } 複製程式碼
11.swift字串
-
字串的CRUD
func textString(){ var astring = "Guten Tag!" if astring.isEmpty { // 空字串 } print("\(astring[astring.startIndex])") // G print("\(astring[astring.index(before: astring.endIndex)])") // ! print("\(astring[astring.index(after: astring.startIndex)])") // u // let aindex = astring.index(astring.startIndex, offsetBy: 7); // print("\(astring[aindex])") // a astring.insert("!", at: astring.endIndex) astring.insert(contentsOf: "there".characters, at: astring.index(before: astring.endIndex)) // 字首 - 字尾 _ = astring.hasPrefix("acutnr") _ = astring.hasSuffix("!") } 複製程式碼
12.範型
-
實用方法:
-
在尖括號裡面寫一個名族建立一個範型函式或者型別
-
定一個函式,傳入一個未知型別引數,重複N詞,返回陣列,陣列紅元素型別就是傳入的型別
-
-
使用範型- 重新實現可選型別
-
定義可選型別的列舉
-
使用賦值
-
-
實現方法,限定引數遵守協議,型別是相同的
-
比較兩個陣列中相同的元素,有返回true,沒有返回false
-
可以計算 兩個集合中相同的元素返回
-
在型別名之後使用where 制定型別的需求
-
比如,限定型別實現某一個協議,限定兩個型別是相同的,或者限定某個類必須有一個特定的父類”
-
where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element
func anyCommonElements<T:Sequence,U:Sequence>(_ lhs :T,_ rhs: U)->Bool where T.Iterator.Element:Equatable,T.Iterator.Element == U.Iterator.Element{ for lhsElement in lhs { for rhsElement in rhs { if lhsElement == rhsElement { return true } } } return false } 複製程式碼
-
13.集合操作
-
a.intersection(b)
A和B集合的交集 (A&B) -
a.symmtriDifference(b)
A +B - (A&B) -
a.union(b)
A+B -
a.subtracting(b)
A-(A&B)
14.遞迴列舉
-
在列舉成員前面,加上 indirect 關鍵字,是可以遞迴的
enum ArithmeticExpression { case number(Int) indirect case addition(ArithmeticExpression,ArithmeticExpression) indirect case multiplication(ArithmeticExpression,ArithmeticExpression) } 複製程式碼
-
呼叫列舉
let five = ArithmeticExpression.number(5) let foure = ArithmeticExpression.number(4) let sum = ArithmeticExpression.addition(five, foure) let procuct = ArithmeticExpression.multiplication(sum, .number(2)) 複製程式碼
-
操作能可以遞迴的列舉,需要可以遞迴的函式,
-
如果是純數字,直接返回該值,如果是加法,或者乘法,計算左右的演算法的值,然後相加,乘
func evaluate(_ expression:ArithmeticExpression) -> Int{ switch expression { case let .number(value): return value case let .addition(left, right): return evaluate(left) + evaluate(right) case let .multiplication(left, right): return evaluate(left) * evaluate(right) } } 複製程式碼
15.Swift 下標 subscript
-
寫法:
-
定義下標使用
subscript
關鍵字,指定一個或多個輸入引數和返回型別 -
與例項方法不同的是,下標可以設定為讀寫或只讀
subscript (index:Int)->Int{ get{ //返回一個適當的int 型別的操作 return 0 } set(newValue){ // 執行適當的賦值操作 } } 複製程式碼
-
下標可以接受任意數量的入參,並且這些入參可以是任意型別。下標的返回值也可以是任意型別。下標可以使用變數引數和可變引數,但不能使用輸入輸出引數,也不能給引數設定預設值
-
定義了一個Matrix結構體,用於表示一個Double型別的二維矩陣
struct Matrix { let rows: Int, columns: Int var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns grid = Array(repeating: 0.0,count: rows * columns) } func indexIsValidForRow(row: Int, column: Int) -> Bool { return row >= 0 && row < rows && column >= 0 && column < columns } // N 行 * N 列的矩陣 subscript(row: Int, column: Int) -> Double { get { assert(indexIsValidForRow(row: row, column: column), "Index out of range") return grid[(row * columns) + column] } set { assert(indexIsValidForRow(row: row, column: column), "Index out of range") grid[(row * columns) + column] = newValue } } } 複製程式碼
-
使用
16.swift析構過程
- 析構器用
deinit
表示 -- 構造器init - deinit {}
17.swift訪問控制
-
模組和原始檔
- 使用
import
匯入另外一個模組
- 使用
-
訪問級別 五種不同的訪問級別
-
開放訪問/公開訪問 -----同一模組下的任意檔案,任意方法,任意實體
-
內部訪問 ----在模組內訪問任何實體,到那時不能從外部匯入模組訪問
-
檔案私有訪問 只能在定義的檔案內部訪問
-
私有訪問限制 只能在定義的作用域內訪問
-
-
開放訪問許可權最高,私有訪問最低訪問級別
-
開放訪問只作用於類型別和類的成員,和公開訪問區別如下
-
開放訪問的類,可以在模組內,模組外繼承,公開訪問和更嚴的訪問級別的類,只能在他們定義的模組內部被繼承
-
開放訪問的類成員,可以在模組內,模組外的子類重寫,公開訪問只能在定義的模版內部重寫。
-
預設訪問級別
interal
級別 -
單目標程式,是為整個程式服務的,預設interal 即可。
-
訪問控制語法
-
通過
open
,public
,internal
,filepart
,private
, 修飾符,宣告實體的訪問級別:
-
-
子類的訪問級別不得高於父類的訪問級別
-
函式的訪問級別
18.Pch 檔案建立
- 工程 - >TARGETS -> Bulid Settings ->搜尋prefix -> LLVM -Language 下的
Precompile Prefix Header
設定置為YES,預設是NO。 - LLVM -Language 設定下,
Prefix Header
pch檔案路徑