//类和结构体
//共同点:1.定义属性用于存储值 2.定义方法用于提供功能
//3.定义构造器用于生成初始化值 4.通过扩展以增加默认实现的功能
//5.实现协议以提供某种标准功能
//类的附加功能有:1.继承允许一个类继承另一个类的特征
//2.类型转换允许在运行时检查和解释一个类实例的类型
//3.允许一个类实例释放任何其所被分配的资源
//4.引用计数允许对一个类的多次引用
struct Dlg{
var width = 0
var height = 0
//var ddd = MyMode()
}
class Mode {
var dlg = Dlg() //结构体Dlg的实例,
var interlaced = false
var frameRate = 0.0
var name : String?
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//结构体和类都使用构造器语法来生成新的实例。
var myDLG=Dlg()
let myMode=Mode()
//print("width is \(myDLG.ddd.frameRate)") //width is 0.0
print("width is \(myDLG.width)")//width is 0
print("width is \(myMode.dlg.width)")//width is 0
//与 Objective-C 语言不同的是,Swift 允许直接设置结构体属性的子属性
myDLG.width = 300
myMode.dlg = myDLG
print("the width is \(myMode.dlg.width)")//the width is 300
//注意:结构体和枚举是值类型
//!!! 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。
myDLG.width=1000
print("the width is \(myMode.dlg.width)")//the width is 300(因为是值类型)
//结构体类型的成员逐一构造器(Memberwise Initializers for Structure Types)
//与结构体不同,类实例没有默认的成员逐一构造器。
let ddd=Dlg(width: 20, height: 40)
let ddd2=ddd
//因为 Dlg 是一个结构体,所以ddd2 的值其实是 ddd 的一个拷贝副本,而不是 ddd 本身
//枚举也遵循相同的行为准则:
enum CompassPoint {
case North, South, East, West
}
var currentDirection = CompassPoint.West
let rememberedDirection = currentDirection
currentDirection = .East
if rememberedDirection == .West {
print("The remembered direction is still .West")
}
// 输出 "The remembered direction is still .West"
//注意: 类是引用类型
//与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝。
let myClass=Mode()
myClass.name="你好啊"
let myClass2=myClass
print(myClass2.name!) //你好啊
//恒等运算符 等价于(===) 不等价于(!==)
//运用这两个运算符检测两个常量或者变量是否引用同一个实例:
if myClass === myClass2{
print("两个常量引用同一个实例")
}//两个常量引用同一个实例
//注意 “等价于”(===)和 “等于”(==)的不同
//1.等价于表示两个类型的常量或变量引用同一个类实例
//2.等于表示两个实例的值“相等”或“相同”
//类和结构体的选择
//当符合一条或多条以下条件时,请考虑构建结构体:
//.该数据结构的主要目的是用来封装少量相关简单数据值
//.该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用
//.该数据结构中存储的值类型属性也应该被拷贝,而不是被引用
//字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为
//swift 中,许多基本类型,如String Array Dictionary 类型均已结构体的形式实现。这意味着被赋值给新的常量或变量,或被传入函数或方法中时,他们的值会被拷贝
//OC 中 NSString NSArray 和NSDictonary类型均以类的形式实现,而并非结构体。他们在被赋值或者被传入函数或方法时,不会发生值拷贝,而是传递现有实例引用
var aa : Array = ["one" , "two" ,"three"]
var bb = aa
bb.append("four")
print(bb) //["one", "two", "three", "four"]
print(aa) //["one", "two", "three"]
}
}