swift學習筆記《4》

ytmaylover發表於2018-09-05

1.swift Protocol

  • 設定可選協議方法

    • 需要遵守NSObjectProtocol 協議

    • 協議需要是 @objec

    • 方法是需要@object optional

      @objc protocol CircleDelegate:NSObjectProtocol {
          @objc optional func cirelcPrint()
      }
      複製程式碼

      swift學習筆記《4》

    • 定義delegate 屬性 weak var delegate:CircleDelegate?

    • 呼叫代理方法 delegate?.cirelcPrint?()

      swift學習筆記《4》

  • protocol mutating 關鍵字

    • 使用mutation 關鍵字來標記一個會修改結構體的剛發

    • class 中不需要使用mutating標記,因為類總方法通常可以修改類屬性

      swift學習筆記《4》

    • 可以給系統方法增加寫extion,遵守代理

      swift學習筆記《4》

2.switchCase

  • case let x where x.hasSuffix("peper"): print("li it a spicy")

  • 可以在case中使用where 進行判斷

    swift學習筆記《4》

3.元組

  • 取元組可以根據屬性,也可以根據下標取

    let amutule : (min:Int,max:Int,sum:Int) = (2,4,6)
    print(amutule.sum)
    print(amutule.2)
    複製程式碼

    swift學習筆記《4》

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))")
    複製程式碼

    swift學習筆記《4》

5.函式作為一個引數,傳入另一個函式中

  • 一個函式傳入一個引數,一個判斷條件的函式引數,返回值是bool

  • 在函式內部,傳引數1,呼叫函式引數判斷

    swift學習筆記《4》

6.函式作為返回值

  • 函式作為返回值

  • 適用的時候,生產函式型別的變數,呼叫變數(函式)方法

    swift學習筆記《4》

7.集合map的使用

  • 使用map 批量操作集合內的元素

  • 匹配符合集合的元素批量處理,也可以進行判斷,不符合條件的為0

  • 如果一個閉包的型別已知,並且作為回撥函式,可以忽略引數型別和返回值,單個閉包語句,會把它語句的值當作返回值返回

    swift學習筆記《4》

  • 可以通過引數所在的位置,替代引數名來引用引數,在非常短的閉包中非常有用

    swift學習筆記《4》

8.setter 和getter 方法

  • 在setter 中新值是newValue

  • 可以在set 後面顯示設定一個別名

    swift學習筆記《4》

9.監測API 可用性

  • 監測API 可用性 iOS 10
    func textAPI(){
        if #available(iOS 10, macOS 10.12,*) {
        // 在iOS 10使用,MacOS 10。12使用
        }else{
            // 使用先前的iOS,macOS的API
        }
    }
    複製程式碼
    swift學習筆記《4》

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)")
    }
    複製程式碼

    swift學習筆記《4》

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("!")
    }
    複製程式碼

    swift學習筆記《4》

12.範型

  • 實用方法:

    • 在尖括號裡面寫一個名族建立一個範型函式或者型別

    • 定一個函式,傳入一個未知型別引數,重複N詞,返回陣列,陣列紅元素型別就是傳入的型別

      swift學習筆記《4》

  • 使用範型- 重新實現可選型別

    • 定義可選型別的列舉

    • 使用賦值

      swift學習筆記《4》

  • 實現方法,限定引數遵守協議,型別是相同的

    • 比較兩個陣列中相同的元素,有返回true,沒有返回false

    • 可以計算 兩個集合中相同的元素返回

    • 在型別名之後使用where 制定型別的需求

    • 比如,限定型別實現某一個協議,限定兩個型別是相同的,或者限定某個類必須有一個特定的父類”

    • where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element

      swift學習筆記《4》

    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)

    swift學習筆記《4》

14.遞迴列舉

  • 在列舉成員前面,加上 indirect 關鍵字,是可以遞迴的

    enum ArithmeticExpression {
        case number(Int)
        indirect  case addition(ArithmeticExpression,ArithmeticExpression)
        indirect case multiplication(ArithmeticExpression,ArithmeticExpression)   
    }
    複製程式碼

    swift學習筆記《4》

  • 呼叫列舉

    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)
        }
    }
    
    複製程式碼

    swift學習筆記《4》

15.Swift 下標 subscript

  • 寫法:

  • 定義下標使用subscript關鍵字,指定一個或多個輸入引數和返回型別

  • 與例項方法不同的是,下標可以設定為讀寫或只讀

    subscript (index:Int)->Int{
        get{
            //返回一個適當的int 型別的操作
            return 0
        }
    
        set(newValue){
            // 執行適當的賦值操作
        }
    
    }
    複製程式碼
  • 下標可以接受任意數量的入參,並且這些入參可以是任意型別。下標的返回值也可以是任意型別。下標可以使用變數引數和可變引數,但不能使用輸入輸出引數,也不能給引數設定預設值

  • 定義了一個Matrix結構體,用於表示一個Double型別的二維矩陣

    swift學習筆記《4》

    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
            }
        }
    }
    複製程式碼
  • 使用

    swift學習筆記《4》

16.swift析構過程

  • 析構器用deinit 表示 -- 構造器init
  • deinit {}

17.swift訪問控制

  • 模組和原始檔

    • 使用import 匯入另外一個模組
  • 訪問級別 五種不同的訪問級別

    • 開放訪問/公開訪問 -----同一模組下的任意檔案,任意方法,任意實體

    • 內部訪問 ----在模組內訪問任何實體,到那時不能從外部匯入模組訪問

    • 檔案私有訪問 只能在定義的檔案內部訪問

    • 私有訪問限制 只能在定義的作用域內訪問

  • 開放訪問許可權最高,私有訪問最低訪問級別

  • 開放訪問只作用於類型別和類的成員,和公開訪問區別如下

  • 開放訪問的類,可以在模組內,模組外繼承,公開訪問和更嚴的訪問級別的類,只能在他們定義的模組內部被繼承

  • 開放訪問的類成員,可以在模組內,模組外的子類重寫,公開訪問只能在定義的模版內部重寫。

  • 預設訪問級別 interal 級別

  • 單目標程式,是為整個程式服務的,預設interal 即可。

  • 訪問控制語法

    • 通過 open,public,internal,filepart,private , 修飾符,宣告實體的訪問級別:

      swift學習筆記《4》

      swift學習筆記《4》

  • 子類的訪問級別不得高於父類的訪問級別

  • 函式的訪問級別

    swift學習筆記《4》

18.Pch 檔案建立

  • 工程 - >TARGETS -> Bulid Settings ->搜尋prefix -> LLVM -Language 下的Precompile Prefix Header 設定置為YES,預設是NO。
    swift學習筆記《4》
  • LLVM -Language 設定下,Prefix Header pch檔案路徑
    swift學習筆記《4》

相關文章