Swift 中的 Class 和 Structure
RussellBurr
8年前
<h2><strong>LearniOS</strong></h2> <h2><strong>Swift</strong></h2> <h3><strong>Classes and Structures</strong></h3> <p>1、类的实例通常被看做一个对象。然而,Swift中的类和结构体在功能上比其他语言更加相似,本章所讨论的大部分实例都可以应用在类和结构体类型。因此,我们会主要使用实例。</p> <p>2、当结构体类型在你的代码中传递的时候,它们总是会拷贝。它不会使用引用计数。</p> <p>3、Classes和Structure的声明语法:</p> <pre> <code class="language-swift">class SomeClass { } struct SomeStructure { }</code></pre> <p>4、当你定义一个新的类或者结构体的时候,你实际上就是在定义一种新的Swift类型。你应该使用 UpperCamelCase (eg:SomeClass/SomeStructure)这种命名方式来符合Swift的命名标准(eg:String/Int/Bool)。相反的,你应该用 lowerCamelCase 来个属性或者方法来命名(eg:frameRate/incrementCount),以便和类型名区分。</p> <pre> <code class="language-swift">struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? }</code></pre> <p>5、不像Object-C,Swift可以直接设置结构体属性的紫属性的值。如下面的例子,someVideoMode的resolution的属性width的值可以直接设置,而不需要你在给resolution整个赋一个新值。</p> <pre> <code class="language-swift">struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? } let someVideo = VideoMode() someVideo.resolution.width = 200</code></pre> <p>6、结构体另一种初始化方式:</p> <pre> <code class="language-swift">let vga = Resolution(width: 640, height: 480)</code></pre> <p>类的实例不能这样初始化。</p> <p>7、值类型(Value Types):结构体、枚举、其它基本数据类型等都是值类型。当它在赋值给常量/变量或者传递给函数的时候,会拷贝值。通过下面的例子我们可以发现,虽然cinema的width值变了,但hd的width值并没有变。那是因为Resolution是一个结构体,在进行 var cinema = hd 这一句的时候,系统会拷贝一份hd的值赋给cinema。它们两个是独立的两个结构体实例,所以改变cinema的值时,并不会影响hd。枚举同上。</p> <pre> <code class="language-swift">let hd = Resolution(width: 1920, height: 1080) var cinema = hd cinema.width = 2000 print(hd,cinema) //Resolution(width: 1920, height: 1080) Resolution(width: 2000, height: 1080)</code></pre> <p>8、引用类型(Reference Types):当它们在赋值或者传递给函数的时候不会拷贝值,因此,应用的是已存在的实例本身,并没有拷贝。通过下面的例子我们可以看出,修改了alsoTenEighty的frameRate的值,tenEighty的frameRate的值页跟着改变了。因为类是引用类型,tenEighty和alsoTenEighty其实引用的是同一个VideoMode实例。实际上,它们只是同一个实例的两个不同的名字。</p> <pre> <code class="language-swift">let tenEighty = VideoMode() tenEighty.frameRate = 25.0 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 print(tenEighty.frameRate,alsoTenEighty.frameRate) //30.0 30.0</code></pre> <p>9、通过 === 和 !== 来判断两个实例是否为同一个类。</p> <pre> <code class="language-swift">if tenEighty === alsoTenEighty { print("yes") } //yes</code></pre> <p>=== 和 == 是不同的, === 代表两个类类型的常量或者变量医用同一个类的实例,而 == 代表两个常量或者变量的值相等。</p> <p>10、在Swift中String、Array、Dictionary均已结构体的形式实现;Object-C中NSString、NSSArray、NSDictionary均已类的形式实现。</p> <p>11、在你的代码中,拷贝行为看起来似乎总会发生。然而,Swift在幕后只在绝对必要时才执行实际的拷贝。Swift管理所有的值拷贝以确保性能最优化,所以你没必要去回 避赋值来保证性能最优化。</p> <p> </p> <p>来自:https://github.com/fengzhihao123/LearniOS/blob/master/Swift/ClassesAndStructures.md</p> <p> </p>