您的位置:首页 > 移动开发 > Swift

Swift2-0基础_ClassAndStructures(类和结构体)

2016-04-15 18:45 302 查看
import Foundation
print("Hello, World!")
/*
类和结构体是人们构建代码所用的一种通用且灵活的构造体。
我们可以使用完全相同的语法规则来为类和结构体定义属性(常量、变量)和添加方法,从而扩展类和结构体的功能。
与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件。
你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口。

注意
通常一个 类 的实例被称为 对象。然而在 Swift 中,类和结构体的关系要比在其他语言中更加的密切,我们会主要使用 实例 而不是 对象 。
*/

// 1 类和结构体的对比
/*
Swift 中类和结构体有很多共同点。共同处在于:
• 定义属性用于存储值
• 定义方法用于提供功能
• 定义附属脚本用于访问值
• 定义构造器用于生成初始化值
• 通过扩展以增加默认实现的功能
• 实现协议以提供某种标准功能

与结构体相比,类还有如下的附加功能:
• 继承允许一个类继承另一个类的特征
• 类型转换允许在运行时检查和解释一个类实例的类型
• 解构器允许一个类实例释放任何其所被分配的资源
• 引用计数允许对一个类的多次引用

注意:
结构体总是通过被复制的方式在代码中传递,不使用引用计数。
*/

// 2 定义语法
// 名称依旧使用驼峰法,首字母大写用于区分方法和属性
class Person {

}
struct Student {
//    properties and methods
}
// eg
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name:String?    // 可选类型会被自动赋予一个默认值nil
}

// 3 类和结构体实例
/*
结构体和类都使用构造器语法来生成新的实例。
构造器语法的最简单形式是在结构体或者类的类型名称后跟随一对空括号,如 Resolution() 或 VideoMode()。
通过这种方式所创建的类或者结构体实例,其属性均会被初始化为默认值
*/
let someResolution = Resolution()
let someVideoMode = VideoMode()

// 4 属性访问 点语法
print(someResolution.width)
print(someVideoMode.frameRate)
// 使用 点语法 为变量属性赋值
/*
注意
与 Objective-C 语言不同的是,Swift 允许直接设置结构体属性的子属性。
上就是直接设置了 someVideoMode 中 resolution 属性的 width 这个子属性,并不需要重新为整个 resolution 属性设置新值。
*/
someVideoMode.resolution.width = 750

// 结构体 类型的成员逐一构造器
/*
注意:
与结构体不同,类实例没有默认的成员逐一构造器
*/
let vga = Resolution(width: 640, height: 480)

// 5 结构体和枚举是值类型     Swift 中所有基本类型都是值类型
// 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
// cinema hd 是两个完全不同的实例 cinema由hd拷贝得到
cinema.width = 2048
print(cinema,hd)    // Resolution(width: 2048, height: 1080) Resolution(width: 1920, height: 1080)

// 6 类是引用类型,引用的是已存在的实例的本身而不是拷贝
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let anotherTenEighty = tenEighty
anotherTenEighty.interlaced = false
print(tenEighty.interlaced,anotherTenEighty.interlaced) // false false

// 恒等运算符 等价于(===) 不等价于(!==)
// 因为类是引用类型,有可能有多个常量引用同一类实例,为了判断两个常量或者变量是否引用同一类实例 使用 等价于
if tenEighty === anotherTenEighty {
print("tenEighty is equal to anotherTenEighty")
}

// 7 类和结构体的选择
/*
按照通用的准则,当符合一条或多条以下条件时,请考虑构建 结构体:
• 该数据结构的主要目的是用来封装 少量 相关简单 数据值。
• 有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被 拷贝 而不是被引用。
• 该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。
• 该数据结构不需要去继承另一个既有类型的属性或者行为。
*/

// 8 字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为
/*
Swift 中,许多基本类型,诸如 String , Array 和 Dictionary 类型均以结构体的形式实现。
这意味着被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。
Objective-C 中 NSString , NSArray 和 NSDictionary 类型均以类的形式实现,而并非结构体。
它们在被赋值或 者被传入函数或方法时,不会发生值拷贝,而是传递现有实例的引用。

注意:
以上是对字符串、数组、字典的“拷贝”行为的描述。在你的代码中,拷贝行为看起来似乎总会发生。
然而,Swift 在幕后只在绝对必要时才执行实际的拷贝。Swift 管理所有的值拷贝以确保性能最优化,所以你没必要去回避赋值来保证性能最优化。
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: