• Swift基础学习笔记


    1、在学基本语法之前,简单看一下与OC的不同

      注释:OC       #pragma marks  视图加载完成

         Swift    //MARK: 视图加载完成

              //TOOO:设置背景颜色(Xcode 8.0 特有)

                  //FIXME:更改头像

      创建一个视图View:

          OC     [[UIView alloc]initWithxxx:];

                    Swift    UIView(xxx:)

                               类名() == alloc/init 等价

      类方法:

          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)

    2、常量与变量

               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不在基本数据类型,都是结构体

    3、可选项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)

    4、逻辑分支

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

                }

    5、可选的判断

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

    2、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")

            }

    3、??

       ??是一个简单的三目

            如果有值,使用值

            没有值,使用 ?? 后边的值代替

       //?? 操作符的优先级低 ,在使用的时候最好加上()

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

  • 相关阅读:
    LeetCode278. 第一个错误的版本
    LeetCode275. H 指数 II
    LeetCode274. H 指数
    LeetCode273. 整数转换英文表示
    LeetCode268. 缺失数字
    LeetCode264. 丑数 II
    LeetCode263. 丑数
    关于解决Chrome新版本中cookie跨域携带和samesite的问题处理
    java将list转为树形结构的方法
    Python pycharm selenium hyrobot 学习中遇到的问题汇总2
  • 原文地址:https://www.cnblogs.com/jiang-xiao-yan/p/6381370.html
Copyright © 2020-2023  润新知