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))

相关文章
相关标签/搜索