美文网首页
从零学习Swift 01:了解基础语法

从零学习Swift 01:了解基础语法

作者: 小心韩国人 | 来源:发表于2020-04-02 18:09 被阅读0次

    一:常量

    • 1.只能赋值一次
    • 2.值不要求在编译期间就确定,也就是说可以是编译期,也可以是运行期再确定. 但是在使用前必须赋值
    • 3.常量变量在初始化之前都不能使用

    二:常见的数据类型

    Swift中的数据类型分为两种值类型引用类型:


    可以看到,没有了OC中的基本数据类型了,OC中的基本数据类型都变成了结构体类型.

    思考一下?:为什么Int这种简单的数据类型也要用结构体?

    1. 整数类型又分为:
      Int 8 :8位,一个字节
      Int 16 :16位,2个字节
      Int 32 :32位,4个字节
      Int 64:64位,8个字节
      UInt 8 ,UInt 16 ,UInt 32 ,UInt 64 :无符号整数类型 (u : unsigned)

    2. 浮点类型:
      Float :32位,精度只有6有位
      Double :64位,精度至少15位

    3.浮点类型有多种表达方式:

    • 十进制表示:
      314.0 = 3.14e2 : 3.14e2 表示:3.14 乘以 10 的 2 次方
      0.0314 = 3.14e-2:3.14e-2 表示:3.14 乘以 10 的 -2 次方

    • 十六进制表示:
      40.0 = 0xAp2:0xAp2 表示: 0xA 乘以 2 的 2 次方
      2.5 = 0xAp-2:0xAp-2 表示: 0xA 乘以 2 的 -2 次方

    三:元组 (Tuple)

    元组就是将多个类型组合成一个对象:

    1. 元组的定义和访问
        //定义元组
        let resultTuple = (14,"Tom")
        //通过下标访问元素
        print("age is \(resultTuple.0) name is \(resultTuple.1)")
        
        //定义有标签的元组
        let resultTuple2 = (age: 22 , name: "Jack")
        //通过标签访问元素
        print("age is \(resultTuple2.age) name is \(resultTuple2.name)")
    
    1. 元组分解:
        let (age , name) = resultTuple2
        print("age is \(age) name is \(name)")
    
    1. 使用场景:
      3.1 作为函数的返回值(多个返回值)和参数
    func funcTest(v1: Int, v2: String) -> (result1: Int, result2: String){
        
        //定义元组
        let resultTuple = (14,"Tom")
        //通过下标访问元组
        print("age is \(resultTuple.0) name is \(resultTuple.1)")
        
        //定义有标签的元组
        let resultTuple2 = (age: 22 , name: "Jack")
        print("age is \(resultTuple2.age) name is \(resultTuple2.name)")
        
        let (age , name) = resultTuple2
        print("age is \(age) name is \(name)")
    
        return resultTuple
        
    }
    funcTest(v1: 22, v2: "Jcak")
    

    3.2 值绑定

    //元组值绑定
    func tupleTest(){
        let point = (8,8)
        switch point {
        case (let x,0):
            print("点在 y 轴上 x坐标为\(x)")
        case (0, let y):
            print("点在 x 轴上 坐标为\(y)")
        case (0...8,0...8):
            print("坐标在 0 ~ 8 范围内")
        case(let x, let y):
            print("x坐标为\(x) , y坐标为\(y)")
        }
    }
    

    三:流程控制

      1. if,while后面的条件语句可以省略小括号.
      1. swift 3以后省略了++,--运算符,使用-=, +=代替
      1. for循环使用区间运算符
        • 1.1...3:闭区间,取值1,2,3
        • 2.1..<3:半开区间,取值1,2
        • 3....3:单侧区间,让区间朝一个方向尽可能远,只要不越界
    • 4.带间隔的区间值

    func test(){
        let finish = 12
        let interval = 3
    
        // 从6开始,到12为止,间隔 3 打印,包括 12
        for i in stride(from: 6, through: finish, by: interval){
            print(i)
        }
    
        print("---------------------")
    
        // 从6开始,到12为止,间隔 3 打印,不包括 12
        for i in stride(from: 6, to: finish, by: interval){
            print(i)
        }
    }
    
    • 5.switch
      - 1switch必须要保证能处理所有情况
      - 2switch中的casedefault后面不能写大括号
      - 3.switch可以默认不写break,不会贯穿到最后面
      如果想要实现贯穿效果,可以使用fallthrough
      - 4.case,default后面至少要有一条语句
      - 5.switch也支持Character,String类型
      - 6.switch同样支持区间匹配0...3,元组匹配(-2...2,-2...2)

    四:函数

    4.1 函数的定义

    func sum(v1: Int, v2: Int) -> Int{
        v1 + v2
    }
    print(sum(v1: 10, v2: 20))
    

    无返回值的三种写法:

    func returnVoid1(v1: String) -> (){
       //无返回值 可直接空元组
    }
    
    func returnVoid2(v1: String) -> Void{
       //无返回值 Void
    }
    
    func returnVoid3(v1: String){
       //无返回值 什么也不写
    }
    

    4.2 参数标签

    func sum3(v1: Int , v2: Int) -> Int{
        v1 + v2
    }
    
    //参数标签 v1 , v2
    sum3(v1: 10, v2: 20)
    

    可使用_省略参数标签

    //参数标签
    func sum3(_ v1: Int , _ v2: Int) -> Int{
        v1 + v2
    }
    
    //省略参数标签 v1 , v2
    sum3(10, 20)
    

    4.3 可变参数

    //可变参数
    func sum1(numbs:Int...) -> Int{
        var sum = 0
        for number in numbs{
            sum += number
        }
        return sum
    }
    
    print(sum1(numbs: 10,20,30))
    

    需要注意的是:一个函数最多只能有1个可变参数,且紧跟在可变参数后面的参数不能省略参数标签,因为一旦省略可变参数后面参数的参数标签,编译器就无法判断给哪个形参赋值

    4.4 swift 自带 print 函数

    public func print(_ items: Any..., separator: String = " ", terminator: String = "\n")
    

    其实print函数的第一个参数就是一个可变参数.后面两个参数都已经设置了默认值,分别是间隔符和换行符号.我们可以自己更改后面两个参数:

    4.5 输入输出参数 (In-Out Parameter)
    swift中函数的参数默认是let(常量),并且规定只能是常量:

    所以,如果我们想要在函数内部修改外部实参的值,就需要用inout定义一个输入输出参数:

    //输入输出参数
    var num = 10
    func inOutTest(_ v1: inout Int){
        v1 = 20
    }
    inOutTest(&num)
    
    

    注意:
    1: inout 参数不能有默认值
    2: inout 参数只能传入可以被多次赋值的
    3: 可变参数不能标记为inout
    4: inout 参数本质是 地址传递 (引用传递).这一点我们可以通过汇编证明:
    我们在inOutTest(&num)处打一断点,进入汇编代码如下:

    汇编分析 inout 参数

    五:函数类型 (Function Type)

    函数类型由 参数类型 + 返回值类型组成:

    func sum(v1: Int, v2: Int) -> Int{
        v1 + v2
    }
    
    //定义一个类型为 (Int,Int) -> Int 的函数常量 fn , 并把 sum 函数赋值给 fn
    let fn:(Int,Int) -> Int = sum
    
    //调用 fn,并且不需要写 参数标签
    let num = fn(2,3)
    print(num)
    

    函数类型作为参数使用:

    //函数类型作为参数使用
    func funcTypeTest(_ fn: (Int,Int) -> Int, v2: Int ,v3: Int) -> Int{
        //调用作为参数传入的函数 fn
        fn(v2,v3)
    }
    
    let rel = funcTypeTest(sum, v2: 5, v3: 5)
    print(rel)
    
    

    函数类型作为返回值使用:

    ////函数类型作为 返回值
    func funcTypeTest2(_ v1: String) -> (Int,Int) -> Int{
        func plus (_ v1: Int, _ v2: Int) -> Int{
            v1 + v2
        }
        
        func sub (_ v1: Int, _ v2: Int) -> Int{
            v1 - v2
        }
        
        switch v1 {
        case "+":
            return plus
        case "-":
            return sub
        default:
            return plus
        }
        
    }
    
    let rel2 = funcTypeTest2("+")(1,1)
    print(rel2)
    

    相关文章

      网友评论

          本文标题:从零学习Swift 01:了解基础语法

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