• Swift学习笔记:类和结构


    一、类和结构的异同

    类和结构有一些相似的地方。它们都能够:
    1. 定义一些能够赋值的属性;
    2. 定义具有功能性的方法
    3. 定义下标。使用下标语法
    4. 定义初始化方法来设置初始状态
    5. 在原实现方法上的可扩展性
    依据协议提供某一特定类别的基本功能
    1. 类另一些结构不具备的特性:
    2. 类的继承性
    3. 对类实例实时的类型转换
    4. 析构一个类的实例使之释放空间

    5. 引用计数,一个类实例能够有多个引用


    1. 定义语法

    struct Name{
        let firstName = ""
        let secondName = ""
    }
    class Student{
        var name = Name()
        var height = 0.0
        var score = 0
    }
    let a = Student()

    如代码所看到的,我们定义了一个结构体Name和一个类Student。在定义结构体和类的过程中有下面几点须要注意
                   注意:
                        ① 基于书写规范。结构体和类的定义最好首字母大写
                        ② 结构体和类的定义中,每一个属性均须要给出默认值,否则编译器会报错

    2. 訪问属性以及结构类型初始化

    let name1 = Name(firstName:"小",secondName:"本狼")
    let a = Student()
    a.name = name1;
    a.height = 185

         上面的代码中。首先我们初始化了Name结构体的一个实例name1,然后初始化了Student类的实例,并对这个实例进行赋值。重点有下面几个方面
                   重点:
                        ① 结构体的初始化能够像调用外部函数一样。通过属性名称指定初始值
                        ② 属性的訪问,在实例后加上“.”再加上属性名称就可以訪问属性

                   注意:
                        ① 和结构不同。类实例不可以使用成员初始化方法。类的初始化会在后面专门介绍
                        ② 和Objective-C不同,Swift可以直接设置一个结构属性的子属性


    二、结构和枚举类型是数值类型

              数值类型是说当它被赋值给一个常量或者变量,或者作为參数传递给函数时,是完整地复制了一个新的数值。而不是只改变了引用对象。

    struct Name{
        var firstName = ""
        var secondName = ""
    }
    var a = Name(firstName:"小",secondName:"笨狼")
    var b = a
    a.firstName = "大"
    println(b.firstName)    //输出:小
         如上面的样例所看到的,结构类型的赋值是完整的创建一个新的值,原来对象改变不会对赋值对象产生不论什么影响

    、类是引用类型
         
              和结构类型不一样。类是属于引用类型,类的赋值仅仅是用引用赋值
    struct Name{
        var firstName = ""
        var secondName = ""
    }
    class Student{
        var name = Name()
        var height = 0
        var score = 0
    }
    let a = Student()
    let b = a
    a.score = 98
    println(b.score)    //输出:98
              如上面的样例所看到的,将a对b赋值,a的属性改变。b的属性也会随之改变。由于a和b是2个指针,他们都指向同一地址

    四、特征操作
              推断2个对象是否指向同一个实例地址。须要用===和!

    ==来推断

    let a = Student()
    let b = a
    if a === b{
        println("a=b")
    }else{
        println("a != b")
    }   //输出 a=b
         如上面的代码所看到的。a和b指向同一个实例,会输出a=b。     
              注意:
                   ① 这并非推断他们是否属于同一个类。假设b是Student类的还有一个实例。则会不相等
                   ② 不能使用==。编译器会报错

    五、怎样选择使用类还是结构
              在代码中能够选择类或者结构来实现你所须要的代码块,完毕对应的功能。

    可是结构实例传递的是值。而类实例传递的是引用。那么对于不同的任务,应该考虑到数据结构和功能的需求不同,从而选择不同的实例。
              一般来说,以下的一个或多个条件满足时,应当选择创建一个结构:
                   1. 结构主要是用来封装一些简单的数据值
                   2. 当赋值或者传递的时候更希望这些封装的数据被赋值。而不是被引用过去
                   3. 全部被结构存储的属性本身也是数值类型
                   4. 结构不须要被另外一个类型继承或者完毕其他行为
              在其他情况下,类会是更好的选择。

    也就是说普通情况下,数据都会定义为类

    六、集合类型的赋值和复制操作
              和Objective-C不一样,Swift中。数组Array和字典Dictionary是用结构来实现的,以下我们来看看他们详细有什么不一样的地方
         

    1. 字典的赋值和复制操作

    var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]
    var copiedAges = ages
    ages["Wei"] = 0
    println(ages)       //输出:[Anish: 65, Wei: 0, Peter: 23, Katya: 19]
    println(copiedAges) //输出:[Anish: 65, Wei: 35, Peter: 23, Katya: 19]
              因为字典是数值类型,赋值的时候会完整的赋值。           
              假设字典中的键值是数值类型(结构或者枚举),它们在赋值的时候会同一时候被复制。相反,假设是引用类型(类或者函数),引用本身将会被复制,而不是类实例或者函数本身。字典的这样的复制方式和结构同样。


         2. 数组的赋值和复制操作
              和字典Dictionary类型比起来。数组Array的赋值和复制操作就更加复杂。

    Array类型和C语言中的类似,只只会在须要的时候才会完整复制数组的值。


              假设将一个数组赋值给一个常量或者变量,或者作为一个參数传递给函数,复制在赋值和函数调用的时候并不会发生。这两个数组将会共享一个元素序列,假设你改动了当中一个,另外一个也将会改变。
              对于数组来说,复制仅仅会在你进行了一个可能会改动数组长度操作时才会发生。

    包含拼接,加入或者移除元素等等。当复制实际发生的时候,才会像字典的赋值和复制操作一样。


    var a = [1,2,3]
    var b = a
    a[0] = 5
    println(a)  //输出:[5, 2, 3]
    println(b)  //输出:[5, 2, 3]
    a.append(4)
    println(a)  //输出:[5, 2, 3, 4]
    println(b)  //输出:[5, 2, 3]
              如上面样例所看到的:
                        1. 在将b用a赋值。在仅改变数组中值。不改变长度的情况下。数组不会进行复制。b会随着a改变。


                        2. 在改变长度的情况下,会进行复制,b将是一个新的数组。不会随着a改变
         3. 数组独立
              在数组赋值时,假设不想两个变量公用一个数组,能够用unsharekeyword来使数组独立。

    var a = [1,2,3]
    var b = a
    a.unshare()
    b[0] = 5
    println(a)  //输出:[1, 2, 3]
    println(b)  //输出:[5, 2, 3]
              重点:
                   ① 在调用a.unshare()方法时,会对a数组进行复制,然后让a指向复制数组。其它的指针还指向原对象

          4. 推断2个数组是否指向同一数组地址
                  推断2个数组是否指向同一数组地址能够使用===和!==

    var a = [1,2,3]
    var b = a
    if a === b{ }
                 注意:
                        假设对a或者b调用unshare之后。

    他们就不再指向同一数组地址了
         5. 强制数组拷贝
         假设想要将数组完整拷贝到一个新数组中。能够使用copy方法

    var a = [1,2,3]
    var b = a.copy()
            注意:
                        ①这时候a和b数组是2个不相关的数组,改变值不会对对方有不论什么影
                        ②假设你不确定你须要的数组是否是独立的。那么只使用unshare就能够了。而copy方法无论当前是不是独立的,都会完整拷贝一次,哪怕这个数组已经是unshare的了。










  • 相关阅读:
    python之类的详解
    flask中cookie和session介绍
    Flask数据库的基本操作
    CSRF原理
    Ajax.2
    浅谈Ajax
    Django中的缓存机制
    Django简介
    HTTP协议
    web应用
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5149136.html
Copyright © 2020-2023  润新知