• swift 类和结构体


    1:类和结构体定义
    类和结构体分别通过关键字class 和struct定义。
    swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的。类的方法和属性则用小写字母开头的匈牙利表示法。
    结构体总是通过被复制而进行代码传递的。
    struct SForm{
        var iXX:Int = 99
        var strHello:String = "dsf"
        func testFunc(iXX:Int)->Int{
            return iXX+1
        }
    }
    
    class CTset{
        var iAge:Int = 9
        var strName:String = "xx"
        func testFunction(iAge:Int)->Int{
            return iAge+1
        }
        func testFunctionName(strName:String)->String{
            return "oo"+strName
        }
    }

    2:类和结构体实例

    var structObj = SForm()
    structObj.iXX = 988
    let iRes = structObj.testFunc(4)
    let clsObj = CTset()
    clsObj.iAge = 987
    let iRe:Int = clsObj.testFunction(32)
    let iStr:String = clsObj.testFunctionName("sdf")

    3:结构体初始化

    结构体有一个自动生成的初始化器。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一初始化器之中。

    var objFirst = SForm(iXX:983, strHello:"hel")
    objFirst.iXX = 87
    let objSecond = SForm(iXX:94, strHello:"hwxel")
    //objSecond.iXX = 876 error

    4:结构体是值类型

    var objFirst = SForm(iXX:983, strHello:"hel")
    var objSecond = objFirst
    objSecond.iXX = 5775
    println("objFirst: (objFirst.iXX)  objSecond:(objSecond.iXX)")
    输出:objFirst: 983  objSecond:5775

    5:类是引用类型。

    let clsObj = CTset()
    clsObj.iAge = 987
    var clsObjEx:CTset = clsObj
    clsObjEx.iAge = 874
    println("(clsObj.iAge)  (clsObjEx.iAge)")
    输出:clsObj: 874 clsObjEx: 874

    6:类的等价于运算=== 与不等价于 !== 运算 。表示是否是引用到同一个类对象

    let clsObj = CTset()
    clsObj.iAge = 987
    var clsObjEx:CTset = clsObj
    clsObjEx.iAge = 874
    if clsObj === clsObjEx {
        println("obj same")
    }

    7:类和结构体区别。结构体是值类型,结构体的赋值意味着拷贝行为的发生。而类是引用类型。

    8:集合类型的赋值和拷贝行为。

    swift的数组和字典都是以值类型传递的。

    8.1字典的拷贝。当有字典实例的赋值或者是字典做参数的函数调用时候,字典即发生拷贝行为。字典的key和value的拷贝行为是依赖于她自身到底是引用属性还是值类型。

    var dicFirst:Dictionary = ["key1":"value1", "key2":"value2"]
    var dicSecond:Dictionary = dicFirst
    dicSecond["key1"] = "value1Update"
    dicSecond的值被更新,而dicFirst的值依然保持不变。dicFirst和dicSecond是两个独立的字典。它的key和value在赋值时候发生了拷贝,因为都是String类型。
    class CTset{
        var iAge:Int = 9
        var strName:String = "xx"
        func testFunction(iAge:Int)->Int{
            return iAge+1
        }
        func testFunctionName(strName:String)->String{
            return "oo"+strName
        }
    }
    
    var clsObjFirst = CTset()
    clsObjFirst.iAge = 443
    var dicFirst:Dictionary = ["key1":clsObjFirst]
    var dicSecond:Dictionary = dicFirst两个字典dicFirst 和 dicSecond分别为不同的字典,但它的值 clsObjFirst的地址却是同一个。因为它是类类型,是引用传递。

    8.2数组的赋值与拷贝。数组的拷贝行为只有在数组的长度发生变化的时候才会拷贝。当然数组里面的内容,是要遵循引用类型还是值类型的。

    var arrayFirst = [1, 33]
    var arraySecond = arrayFirst
    arraySecond[0] = 89
    //arrayFirst[0]和arraySecond[0] 都会被修改成 89 因为数组长度没变化,所以没发生拷贝
    var arrayFirst = [1, 33]
    var arraySecond = arrayFirst
    arrayFirst.append(222)//长度变化,arrayFirst拷贝,独立另外一个数组
    arrayFirst[0] = 99
    println("first:(arrayFirst)
    second:(arraySecond)")
    输出:
    first:[99, 33, 222]
    second:[1, 33]

     在用多个变量(var)引用一个数组时候,可以用unshare()方法,强制拷贝数组。

    var arrayFirst = [1, 2]
    var arraySecond = arrayFirst
    var arrayThird = arrayFirst
    arraySecond.unshare()//拷贝独立成另外个数组
    arrayThird.unshare()//拷贝独立成另外个数组
    arrayFirst[0] = 3
    arraySecond[0] = 4
    arrayThird[0]=5
    println("first:(arrayFirst)
    second:(arraySecond) 
    third:(arrayThird)")
    输出:
    first:[3, 2]
    second:[4, 2] 
    third:[5, 2]

    8.3 数组等价于(===)和不等价于(!==) 

    8.4强制复制数组

    通过copy强制复制数组,进行的是数组类容浅拷贝,并返回个新的数组引用。

    var arraySource = [1, 2, 3]
    var arrayCopy = arraySource.copy()
    arraySource[0] = 4
    arrayCopy[1] = 5
    println("source:(arraySource)
     copy:(arrayCopy)")
    输出:
    source:[4, 2, 3] 
    copy:[1, 5, 3]
  • 相关阅读:
    [unity3d程序] 纹理扩散
    深入浅出SharePoint——自定义带ECB列
    深入浅出TFS——工作区Workspace
    深入浅出SharePoint——部署WSP
    深入浅出SharePoint——批处理高效导入数据
    深入浅出SharePoint——Log4net应用
    遍历文件夹及文件
    深入浅出SharePoint——使用CAML定制View
    拷贝文件到另一台电脑
    深入浅出SharePoint——在自定义表单中使用上传附件控件
  • 原文地址:https://www.cnblogs.com/zhidao-chen/p/3881410.html
Copyright © 2020-2023  润新知