Swift基礎學習筆記

一、在學基本語法以前,簡單看一下與OC的不一樣程序員

  註釋:OC       #pragma marks  視圖加載完成安全

     Swift    //MARK: 視圖加載完成閉包

          //TOOO:設置背景顏色(Xcode 8.0 特有)ide

              //FIXME:更改頭像函數

  建立一個視圖View:spa

      OC     [[UIView alloc]initWithxxx:];指針

                Swift    UIView(xxx:)調試

                           類名() == alloc/init 等價code

  類方法:對象

      OC     [UIColor  redColor];

      Swift   UIColor.red

      2.0  UIColor.redColor

  訪問當前對象的屬性,Swift能夠不使用self.:

            OC       [self.view  addSubview:v];

      Swift  view.addSubview(v)

      建議:都不用,在編譯器提示的時候再添加,會對語境有更好的體會

         緣由:閉包(相似OC block),須要使用self.

  沒有";"

     ";"目的分割語句的,在Swift中,默認不須要

  枚舉類型:

      OC        UIButtonTypeContactAdd

             Swift      ‘.’contactAdd

  監聽方法

       OC         @selector

            Swift      #selector 若是帶參數不使用‘:’

         2.0 直接使用"",若是帶參數使用‘:’

  調試

            Swift        print

                           沒有時間

                           效率比NSLog更高

  跟蹤函數

           OC     __FUNCTION__

           Swift    #function

            //2.0語言print(__FUNCTION__)

           //3.0語言   print(#function)

二、常量與變量

           1》 關於常量let和變量var的選擇:

    不可變的會更加安全,開發時,一般使用let,再須要改變的時候,再改爲var

    2》若是一個變量從未被改變,會提出警告

     //Variable 'x' was never mutated; consider changing to 'let' constant

          //變量x歷來沒有被修改,建議使用let

     3》修改視圖屬性,依然使用常量

          let v = UIView()

          //僅僅修改v的屬性,並無修改v的指針地址

          v.backgroundColor = UIColor.redColor()

    4》若是須要指定變量和常量的類型,能夠使用 let x:類型 = 值

      提示:在Swift開發中,極少使用直接指定類型,一般都是自動推導

    5》定義變量var,定義後能夠修改;常量let,定義以後不可修改

      自動推導變量和常量的類型會根據右側的代碼的執行結果,推導對應的類型

      熱鍵:option + click 查看類型

      整數:Int 與OC中的NSInteger相似

      小數:Double 與OC中的CGFloat相似

    6》在Swift中對類型要求異常嚴格

      任何不一樣類型的數據之間,不容許直接運算,不會作默認隱式轉化,全部的數據類型肯定都要由程序員負責

    7》Swift不在基本數據類型,都是結構體

三、可選項Optional

    (1)原始的可選項定義(None 沒有值 或者 Some某一類值)

       let x:Optional = 10

     (2)簡單的定義

      '?'用來定義 y是一個可選項的整數類型

      let y:Int? = 20

      若是不進行初始化會直接報錯:

        Constant 'y' captured by a closure before being initialized

             //常量y使用以前必須初始化

      不一樣類型之間的值不能夠直接運算,若是沒有值則默認nil,不是任何數據類型,不參與計算,print(x+y)提示錯誤;

        解決:'!'強行解包,在可選值中選擇非空值,若是值初始化爲nil,會崩潰

      

     定義y,沒有初始化

            let y:Int?

          給常量設置數值,初始化的工做能作一次

            y = 20

          //兩次修改常量會報錯

            //y = 3

            var 的可選項默認爲nil

          //let 的可選項沒有默認值

                var x:Int?

               //輸出nil

               x = 10

              x = 100

          //輸出可選項100

              print(x)

四、邏輯分支

   1>簡單的分支

    a.條件不須要()

    b.語句必須有{}

     if x < 6 {

     }else {

       }

    2>三目(三目語法跟OC同樣)

     x > 5 ? print() : print()

     有時候使用'()'表示空執行

     x > 5 ? print() : ()

    3>switch 

    /*

        1.switch 能夠針對任意類型的值進行分支,不在侷限整數

        2.switch 通常不須要break

        3.switch 若是多時,使用','

        4.全部的分支至少須要一條指令,若是什麼都不幹,才使用break

        */

      func  demo(num: String){

            //let num = 10

            switch num {

            case "10","9":

                print("優")

            case "8":

                break

            default:

                print("通常")

            }

    特殊的使用,不常常出現

    let point = CGPoint(x: 10, y: 10)

            switch point {

            case let p where p.x == 0 && p.y == 0:

                print("原點")

            default:

                print("")

            }

五、可選的判斷

一、if let  和 guard let 的技巧:

  使用同名的變量接收者,在後續使用的都是非空值,不須要解包;

  好處:能夠避免命名的煩惱

  guard 守衛/守護

  guard let 和 if let 恰好相反

  if let name = name,age = age {

            //非空的name和age僅在{}有效

            print(name + String(age))

            print("------------")

        }else{

            print("姓名或者年齡爲 nil")

        }

  //guard let 守護必定有值,若是沒有直接返回

      guard let name = name,age = age else{

            print("姓名或者年齡爲 nil")

            return

        }

   //代碼執行至此,name和age必定有值

        //一般判斷是否有值以後,會作具體的邏輯實現,一般代碼多

        //若是用if let 憑空多了一層分支,guard是下降分支層次的辦法

        //guard 是Swift 2.0以後推出的

         print(name + String(age))

二、if let/var 連用語法,目的就是判斷值

    //不是單純的if

 

  if oName != nil && oAge != nil {

 

            print(oName! + String(oAge!))

 

        }

 

        //if let 連用,判斷對象的值是否爲nil,{}內必定有值,能夠直接使用,不須要解包

 

        //if var 連用,{}內能夠對值進行修改

 

        if var name = oName,let age = oAge {

 

              name = "老李"

 

            //進入分支以後,name 和 age 必定有值,不須要解包

 

            //name age 做用域僅在{}中

 

            print(name + String(age))

 

        }else{

 

            print("name 或者 age 爲nil")

 

        }

三、??

   ??是一個簡單的三目

        若是有值,使用值

        沒有值,使用 ?? 後邊的值代替

   //?? 操做符的優先級低 ,在使用的時候最好加上()

   print((x ?? 0) + (y ?? 0))

相關文章
相關標籤/搜索