美文网首页Swift基础iOS Developer
Swift 基本语法(变量常量, 可选项, 逻辑语句)

Swift 基本语法(变量常量, 可选项, 逻辑语句)

作者: Mr_Lucifer | 来源:发表于2017-04-22 17:03 被阅读112次

    前言

    Swift已经到3.1版本, 所以打算把Swift捡起来, 写几篇Swift文章, 从最基础介绍下Swift, 如有错误, 望指正. 下面作者开始聊下 Swift.

    一 Swift与OC简单对比

    Swift 与 OC 基本差异介绍.png

    二 变量与常量

     func demo() -> () {
            
            // 1. 定义变量 var => 定义后, 可以修改  / 常量 let  => 定义后, 不能修改
            var x = 10
            x = 20
            print(x)  // 输出-- 20
            
            let y = 9.5
            print("Double类型 : ", y)  // 输出-- Double类型 :  9.5
            
            // 2. 自动推导. 变量/常量 的类型会根据右侧代码执行结果, 推导对应的类型
            //    热键 : option + click(点击)
            //    let customView: [UIView]
            let customView = UIView()
            print(customView)
            
            
            // 3. 在Swift中对类型要求异常严格,
            // *******任何不同类型的数据之间, 不允许直接运算 ; 不会做 隐式转换.******
            // OC 中写法 (int)b  => 类型强转.
            // Swift 中 Int(b)  => 结构体的构造函数.
            let a = 3
            let b = 8.5
            // print(a + b) 不能直接进行运算
            print(a + Int(b))  // 输出-- 11
            print(Double(a) + b)  // 输出-- 11.5
            
            demo2()
    
        }
    
    // 无参无返回值简写 与标准写法 func demo() -> () 等价. Swift函数 以后详细说明
    func demo2()  {
            
            // 如果需要指定变量/ 常量的类型, 也可以直接使用 let x: 类型 = 值
            // Swift 开发中 很少使用这种方式, 通常都是自动推导
            let a : Double = 3
            let b = 8.5
            print("指定类型 :", a + b)  // 输出-- 指定类型 : 11.5
            
            // 如果定义 UI类, 应该使用 let
            let customView = UIView()
            // 这里 仅仅修改 customeView 是属性, 并没有修改 customView的指针地址, 所以是常量
            customView.backgroundColor = UIColor.red
    
        }
    

    三 可选项 Optional

    **可选项概念 : **
    定义变量时, 如果指定为 可选的, 表示该变量 可以有一个指定类型的值, 也可以是 nil.
    定义变量是, 在类型后面添加一个 '?', 表示该变量是可选的.
    变量可选项 默认值为 nil.
    常量可选项没有默认值.

    定义 : Optional 可能有两个值 (none / some)

     格式(1. 自动推导) : var 变量名: Optional = 值
    
                       let x: Optional = 10
     格式(2. 使用泛型) : var 变量名: Optional<类型> = 值
                       let y: Optional<Int> = 20
     格式(3. 简化格式) : var 变量名: 类型? = 值
                       let z: Int? = 30
    

    可选值参与计算前, 必须解包
    解包后 才能参与计算, 使用 '!' 强行解包

    func demo3() {
            
            // 1. 原始的可选项定义 :  none 没有值 或者 some 某一类值
            let x: Optional = 10
            
            // 2. 简单定义 : '?' 用来定义 y 一个可选的 Int 类型, 可能没有值, 也可能有一个整数
            let y: Int? = 40 
            
            // 输出 Optional(XX) , 提示这个一个可选值
            print(x)   // 输出-- Optional(10)
            print(y)   // 输出-- Optional(40)
    
            // 1. 不同类型之间的值不能直接运算 ! 如果没有值 为 nil, 它不是任何数据类型, 不能参与计算, 所以 print(x + y) 会报错 
            // 2. '!' 强行解包 -- 从可选值中强行获取对应非空值, 如果真为 nil, 就会crash, 所以 程序中少用 '!'
            print(x! + y!)  // 输出-- 50
    
        /*  最常见错误 let y: Int? = nil
            unexpectedly found nil while unwrapping an Optional value.
            在解包时候发现了 nil 值
         */
        }
    
    

    可选项 Optional 三种判断方式 (避免强行解包)

    func judge1() {
    
            /** ?? 是一个简单的三目
             -  如果有值, 使用值
             -  如果没有值, 使用 '??' 后面的值替代
             */
    
            let name: String? = "张三"   //输出-- 张三你好
            // let name: String? = nil   // 输出-- 你好
            
            print((name ?? "") + "你好")
            
        }
    
    func judge2() {
    
            /** 'if let/var' 连用语法,  只有{}内有效  */
            let myName : String? = "李四"
            let myAge: Int? = 40
    
             // if let 连用, 判断对象的值是否为 nil
            if let name = myName, let age = myAge {
                
                // 进入分支后, name 和 age 一定有值, 不需要解包 ; name 和 age 作用域仅在 {} 中
                print(name + String(age))   // 输出-- 李四40
            }
            
        }
    
    func judge3() {
    
            /** 'guard let/var else' 语法,  {}外有效  */
            let myName : String? = "王五"
            let myAge: Int? = 50
            //let myAge: Int? = nil
    
            // 如果没有直接返回
            guard let name = myName, let age = myAge else {
                
                print("name 或 age 为 nil")
                return
            }        
            // 代码执行至此, name 与 age 一定有值
            print(name + String(age))   // 输出-- 王五50
            
        }
    

    四 逻辑语句

     // MARK: - if else
        func demo () {
            
            let x = 3
            /**
             1. 条件语句不需要 ()
             2. 语句必须有 {}
             3. 必须显示的指明具体的判断条件 => Swift中没有 '非零即真' 的概念. 只用 true/false
             */
            
            if x > 5 {
                /// Will never be executed
                // 永远不被执行, 编译器编译的时候, 会做语法检查
                print("大")
            }else{
                print("小")
            }
            
           /*'Int' is not convertible to 'Bool', 不会有OC中 '非零即真', 所以报错
             
             if x {
                 print("真")
             }
             */
      
            /** 三目 */
            let y = 3
            y > 5 ? print("三目 : 大了") : print("三目 : 小了")
            
        }
    
    
     // MARK: - switch
     func demo()  {
            /** switch 不再局限于整数,  可以针对 任意数据类型 进行判断 */
            //String类型
            let num = "9";
            
            switch num {
            case "10":
                print("完美")
            case "8", "9":
                print("优")
            case "7":
                break
            default:
                print("合格")
            }
            
        }
    
     // MARK: - for
     func demo()  {
            /** Swift 取消了传统的for循环 (注意无空格) */
    
             // 变量 i 在 [0, 5) 循环
            for i in 0..<5 {
                print(i)
            }
            print("----------")
            
            // 变量 i 在 [0, 5] 循环
            for i in 0...5 {
                 print(i)
            }
             print("反序遍历")
            for i in (0..<10).reversed() {
                print(i)
            }
            
        }
    

    先简单介绍下Swift 变量常量, 可选项, 逻辑语句. 下篇可以介绍下 字符串, 数组, 字典等.

    以 上 !

    相关文章

      网友评论

        本文标题:Swift 基本语法(变量常量, 可选项, 逻辑语句)

        本文链接:https://www.haomeiwen.com/subject/tpjszttx.html