swift 类和结构体

1.类和结构体是通过关键字class和struct定义的。

swift 的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法。相反的,类的方法和属性则是用小写字母开头的匈牙利表示法。

结构体总是通过被复制而进行代码传递的

  struct SForm{

        

        var iXX:Int =99

        var strHello:String ="adasd"

        func testFunc(iXX:Int)->Int{

            return iXX+1

        }

        

    }

    

    class CTtest {

        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)

        print("ires is   \(iRes)")

        

        let classObj = CTtest()

        classObj.iAge = 890;

        let iRe:Int = classObj.testFunction(34);

        let iStr:String = classObj.testFunctionName("sdfsd")

        

        print("iRe  is\(iRe)")

        

        print("iRe  is\(iStr)")


3.结构体初始化

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

var objFirst = SForm(iXX:983, strHello:"hel")

print("ixx    is \(objFirst.iXX)")

objFirst.iXX = 689;

print("--ixx    is\(objFirst.iXX)")

let objSecond = SForm(iXX:94, strHello:"hwxel")


//ixx    is 983

//--ixx    is 689


4.结构体是值类型

 let objFirst = SForm(iXX:983, strHello:"hel")

        var objSecond = objFirst

        objSecond.iXX = 5775

        print("objFirst:\(objFirst.iXX)  objSecond:\(objSecond.iXX)")

        

        print("objFirst:\(objFirst.iXX)")

       // 输出:objFirst: 983  objSecond:5775    objFirst: 983


5.类是引用类型

  let clsObj = CTtest()

      clsObj.iAge = 897

  var clsObjEx:CTtest = clsObj;

      clsObjEx.iAge = 8598

  print("\(clsObj.iAge\(clsObjEx.iAge)")

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

 let clsObj = CTtest()

        clsObj.iAge = 987

        var clsObjEx:CTtest = clsObj

        clsObj.iAge = 866

        if clsObj === clsObjEx{

        

           print("obj same ")

        }


7.类和结构体区别:

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

8.集合的赋值和拷贝

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

8.1字典的拷贝

当有字典实例的赋值或者是字典做参数的函数调用的时候,字典即发生拷贝行为。

字典的key和value的拷贝行为是依赖于她自身到底是引用属性还是值类型。

   

        var dicFirst:Dictionary = ["key1":"value1","key2":"value2"]

        var dicSecond:Dictionary = dicFirst

        dicSecond["key1"] = "value1Update"

        

        print("\(dicFirst\(dicSecond)")


dicSecond的值被更新,而dicFirst的值依然保持不变。dicFirst和dicSecond是两个独立的字典。它的key和Value 在赋值时候发生了拷贝,

以为都是String类型。

        var clasObjFirst = CTset()

        clasObjFirst.iAge = 435

        var dicFirst:Dictionary = ["key1":clasObjFirst]

        var dicSecond:Dictionary = dicFirst

dicFirst和dicSecond分别为不同的字典,但它的值 clasObjFirst的地址是同一个。因为它是类类型 ,是引用类型

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)\nsecond:\(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)\nsecond:\(arraySecond) \nthird:\(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)\n copy:\(arrayCopy)")
输出:
source:[4, 2, 3] 
copy:[1, 5, 3]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值