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