//swift中的类,不需要像C++一样分开提供声明和定义,更像python中的类一样,类似函数定义一样直接使用
/*
类和结构体的共同点:
1.可以定义属性
2.定义方法
3.可以通过实例.属性的方法来访问成员
4.可以定义初始化函数(构造函数)
5.可以通过定义扩展函数来扩展功能
6.可以使用protocol
类比结构体多的特性:
1.类可以继承,结构体不可以
2.类可以进行类型转换(子类,父类 Type casting),结构体不可以
3.类可以通过析构来释放资源,结构体不可以
4.类有Reference counting,类实例可以被多个reference,
结构体不可以,结构体是value type。
结构体与类区别:
机构体实例可以在定义的时候对成员属性通过默认参数的形式进行逐一赋值(Memberwise)
但是类实例定义时候不可以。var s = TestStruct(memberVar:3)
结构体,枚举和类不一样,结构体和枚举是value type的。即在赋值的时候是整个拷贝的。
Int,String,Float,Bool,Array,Dictionary都是valueType,
如果你通过cmd键点击变量进去就会发现,这些类型都是通过结构体来定义的。
⚠注意:Foundation库中的NSString,NSArray,NSDictionary是用类实现的,他们的
实例在使用的时候是引用类型。
*/
class TestClass {
var memberVar = 0
func memberFunc() {
println("I'm TestClass! memberVar:\(self.memberVar)")
}
}
struct TestStruct {
var memberVar = 0
func memberFunc() {
println("I'm TestStruct! memberVar:\(self.memberVar)")
}
}
var c = TestClass()
//结构体可以在定义的时候给每个成员变量通过函数默认值的形式赋初值,类不可以。
var s =TestStruct(memberVar:3)
//结构体是value type
var s2 =s
s.memberVar = 20
s.memberFunc()//I'm TestStruct! memberVar:20
s2.memberFunc()//I'm TestStruct! memberVar:0
//类是引用类型
var c2 =c
c.memberVar = 20
c.memberFunc()//I'm TestStruct! memberVar:20
c2.memberFunc()//由于c和c2是指向同一个数据的两个引用,这个也会输出20
//Identity equal === !== 判断两个变量是否引用到同一实例。
if (c === c2) {
println("c and c2 reference to the same instance")
}
var c3 = TestClass()
ifc !== c3 {
println("c and c3 reference to the different instance")
}