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
}
}
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)")
结构体有一个自动生成的初始化器。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一初始化器之中。
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
let clsObj = CTtest()
clsObj.iAge = 897
var clsObjEx:CTtest = clsObj;
clsObjEx.iAge = 8598
print("\(clsObj.iAge) \(clsObjEx.iAge)")
// 输出:8598 85986 类的等价于运算===与不等价于!==运算。表示是否是引用到同一个类对象
let clsObj = CTtest()
clsObj.iAge = 987
var clsObjEx:CTtest = clsObj
clsObj.iAge = 866
if clsObj === clsObjEx{
print("obj same ")
}
结构体是值类型,结构体的赋值意味着拷贝行为的 发生 。而类是引用类型
8.集合的赋值和拷贝
swift的数组和字典都是以值类型传递的
8.1字典的拷贝
当有字典实例的赋值或者是字典做参数的函数调用的时候,字典即发生拷贝行为。
字典的key和value的拷贝行为是依赖于她自身到底是引用属性还是值类型。
var dicFirst:Dictionary = ["key1":"value1","key2":"value2"]
var dicSecond:Dictionary = dicFirst
dicSecond["key1"] = "value1Update"
print("\(dicFirst) \(dicSecond)")
以为都是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]