类和结构体,斯维夫特编制程序之旅

By admin in 4858.com on 2019年4月14日

类和结构体

苹果官方文书档案 Classes and Structures

苹果官方文书档案翻译 类和结构体

  与其他编制程序语言商讨所不一样的是,Swift并不须求您为自定义类和布局去创设独立的接口和达成文件。你所要做的是在2个单一文件中定义三个类依然结构体,系统将会自动生成面向其余代码的表面接口。

  与另外编制程序语言研讨所例外的是,斯威夫特并不须要你为自定义类和组织去创制独立的接口和兑现公文。你所要做的是在四个纯粹文件中定义三个类还是结构体,系统将会自动生成面向别的代码的外部接口。

参考资料:

类与结构体的对照

  只顾:平日一个类的实例被称为对象。但是在Swift中,类和结构体的涉及要比在别的语言中进一步的缜密,本章中所研讨的超越四分之二效用都足以用在类和结构体上。因而,大家会注重运用实例而不是目标。

  留意:经常三个类的实例被号称对象。可是在斯威夫特中,类和结构体的涉嫌要比在别的语言中更为的缜密,本章中所研讨的一大半功能都得以用在类和结构体上。因而,大家会重点采纳实例而不是指标。

Getting to Know Enums

概念语法

  class SomeClass {
      // class definition goes here
  }  
  struct SomeStructure {
      // structure definition goes here
  }

一个实际上的代码例子如下:

struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced
}

 

 

Swift学习之枚举、类和组织

类与结构体实例

let someResolution = Resolution()
let someVideoMode = VideoMode()

  相比较类和结构体

  相比较类和结构体

The Swift Programming Language 中文版 -Gitbook

走访属性

print("The width of someResolution is \(someResolution.width)")
// prints "The width of someResolution is 0"

print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// prints "The width of someVideoMode is 0"

someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")

  类和结构体都存有以下特点:

  类和结构体都富有以下特点:

The Swift Programming Language : Enumerations

结构体类型的分子起头化器

let vga = Resolution(width: 640, height: 480)

只是,类实例不会接到暗许的成员开端化器。

  • 概念用于存款和储蓄值的习性
  • 概念提供一定能力或效益的办法
  • 概念提供使用下标语法访问值的下标
  • 类和结构体,斯维夫特编制程序之旅。概念设置起先状态的初步化方法
  • 通过扩张以追加私下认可完结的效用
  • 适合协议提供某种标准成效
  • 概念用于存款和储蓄值的习性
  • 概念提供一定能力或效益的点子
  • 概念提供利用下标语法访问值的下标
  • 概念设置早先状态的初阶化方法
  • 经过扩展以追加私下认可完成的作用
  • 符合协议提供某种标准效率

The Swift Programming Language : Classes and Structures

结构体和枚举是值类型

值类型是1种当它被内定到常量或然变量,也许被传送给函数时会被拷贝的品类。

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
println("cinema is now \(cinema.width) pixels wide")
//println "cinema is now 2048 pixels wide"
print("hd is still \(hd.width) pixels wide")
// prints "hd is still 1920 pixels wide"

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")
}
// prints "The remembered direction is still .West"

 

 

在早先介绍枚举,类和协会此前,先来看看Swift语言的品类系列(Type System)
。命名类型有种种:协议,枚举,结构,类。复合类型有两种:元组和函数。

类是引用类型

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// prints "The frameRate property of tenEighty is now 30.0"

  类还享有结构体未有的效劳,如下:

  类还有所结构体未有的意义,如下:

4858.com 1Type
System

特征运算符

找出三个常量可能变量是不是引用自同三个类实例十一分有用,为了允许那样,Swift提供了多少个特点运算符:

相同于 ( ===)
不相同于( !==)

if tenEighty === alsoTenEighty {
    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
  • 继承使2个类具有另一个类的性状
  • 类型转换同意在运维时检查和解释三个类实例的项目
  • 反开端化允许多个类实例释放别的其所被分配的能源
  • 引用计数允许对贰个类的频仍引用
  • 继承使1个类具有另三个类的特点
  • 类型转换同目的在于运作时检查和平消除释三个类实例的类型
  • 反开始化允许贰个类实例释放其余其所被分配的能源
  • 引用计数允许对2个类的屡屡引用

#1 枚举

一.枚举为1组有关的值定义了2个体协会同的品种。

下边采取枚举表示车的水彩:

4858.com 2枚举

依旧也足以写成:

4858.com 3枚举

2.施用switch语句来相称枚举值

4858.com 4采纳switch语句来相称枚举值

三.枚举的关联值操作(associated values)

好处:能让您存款和储蓄成员值之外的自定义音讯,并且当你每一趟在代码中动用该成员时允许那些消息发出变化。

此间举官方文档的三个事例表达。差异的条形码类型用Switch语句来检查,你能够在switch的case分支代码中领到每一个关联值用作二个常量恐怕变量。

4858.com 5枚举能展开关联值操作

4.枚举的原始值操作(Raw Values)

作为关联值的代表,枚举成员能够被原始值预先填充,其中那几个原始值具有相同的门类。

4858.com 6枚举的原始值操作

原始值与关联值的界别:

对于3个枚举成员,它的原始值是均等的;不过它的关联值是例外的,因为关联值是当你创立1个依据枚举成员的新常量或变量时才设立的。

原始整型值的机关递增

4858.com 7原始整型值的自行递增

因此参数为rawValue的构造函数创建枚举成员,当中possibleNumber是NumberOfApples?类型的

4858.com 8透过参数为rawValue的构造函数创立枚举成员

但壹旦您想要找的possibleNumber的地点是10,那么此构造函数将赶回nil。

4858.com 9执行else分支

类和结构体之间的精选

在意:结构中华全国体育总会是通过被复制的秘诀在代码中传送,由此请不要选择引用计数。

只顾:结构中华全国体育总会是通过被复制的格局在代码中传递,由此请不要采纳引用计数。

#4858.com,二 类和结构体

一.类和结构体的例外:

类允许继承

类型转换(Type casting)允许运转时检查和演讲三个类实例的档次

解构器(Deinitializers)允许2个类实例释放其被分配的能源

引用计数(Reference Counting)允许对贰个类的频仍引用

开端化时,结构体有成员相继构造器(Memberwise Initializers),然而类未有。

4858.com 10Memberwise
Initializers

结构体是值类型,类是引用类型(这几个是最根本的差距!!!)

二.值档次VS引用类型

值类型->传递时,实例及其包罗的性质拷贝

引用类型 ->传递时,操作的是援引。引用的是实例本人,而不是其拷贝

4858.com 11引用的是实例本人

上代码来看:

4858.com 12值类型与引用类型

对于引用类型,须求专注几点

tenEighty和alsoTenEighty是同一个实例的三种叫法

变动的是被引述的根基ViewMode的frameRate属性,而不转移常量tenEighty和alsoTenEighty的值。那多少个常量并不存款和储蓄实例。

归纳的话,值类型就好比双胞胎,引用类型就好比给一位取不一致的绰号。

认清八个常量是不是引用同二个实例,利用恒等运算符能够兑现。

等价于

不等价于

github项目地址

字符串,数组和字典的赋值与拷贝行为

详见文书档案原版的书文

 

 

  概念语法

  概念语法

  使用class关键字来说美赞臣个类,使用struct关键字来表美素佳儿个结构体。

  使用class关键字来表Bellamy个类,使用struct关键字来表爱他美个结构体。

class SomeClass { 
} 
struct SomeStructure { 
} 
class SomeClass { 
} 
struct SomeStructure { 
} 

 

 

在意:类和结构体名称以大写字母起头,属性和措施名称以小写字母起初。

专注:类和结构体名称以大写字母开端,属性和办法名称以小写字母初步。

示范如下

以身作则如下

struct Resolution { 
    var width = 0 
    var heigth = 0 
} 
class VideoMode { 
    var resolution = Resolution() 
    var interlaced = false 
    var frameRate = 0.0 
    var name: String? 
} 
struct Resolution { 
    var width = 0 
    var heigth = 0 
} 
class VideoMode { 
    var resolution = Resolution() 
    var interlaced = false 
    var frameRate = 0.0 
    var name: String? 
} 

 在上面的演示中大家定义了3个名字为Resolution的结构体,用来描述多个荧屏的像素分辨率。这些结构体蕴涵了多少个名叫width和height的储存属性。储存属性是松绑和仓库储存在类或结构体中的常量或变量。当那多少个属性被开端化为整数0的时候,它们会被推断为Int类型。个名字为VideoMode的类,用来讲述三个摄像显示屏的一定情势。这一个类富含了两个储存属性别变化量。第二个是分辨率,它被初始化为1个新的Resolution结构体的实例,具有Resolution的质量类型。新VideoMode实例同时还会伊始化其余多个属性,它们各自是,初步值为false(意为“non-interlaced
video”)的inteflaced,重放帧率起先值为0.0的frameRate和值为可选String的name。name属性会被自动赋予2个暗许值nil,意为“未有name值”,因它是3个可选类型。

 在上边的以身作则中我们定义了七个名称叫Resolution的结构体,用来描述1个显示屏的像素分辨率。这么些结构体包括了多少个名字为width和height的储存属性。储存属性是松绑和仓库储存在类或结构体中的常量或变量。当那两性情子被初阶化为整数0的时候,它们会被估计为Int类型。个名称叫VideoMode的类,用来叙述三个录制显示屏的特定形式。那个类富含了多少个储存属性别变化量。第3个是分辨率,它被初步化为三个新的Resolution结构体的实例,具有Resolution的性质类型。新VideoMode实例同时还会初步化其余四个脾性,它们分别是,伊始值为false(意为“non-interlaced
video”)的inteflaced,回看帧率初阶值为0.0的frameRate和值为可选String的name。name属性会被机关赋予1个暗中认可值nil,意为“未有name值”,因它是贰个可选类型。

  类和结构体实例

  类和结构体实例

   Resolution结构体和VideoMode类的定义仅描述了何等是Resolution和VideoMode。它们并未描述1个特定的分辨率(resolution)只怕摄像方式(video
mode)。为了描述二个特定的分辨率可能摄像格局,大家要求创造3个它们的实例。如下

   Resolution结构体和VideoMode类的概念仅描述了什么样是Resolution和VideoMode。它们并不曾描述二个一定的分辨率(resolution)也许录像情势(video
mode)。为了描述1个特定的分辨率恐怕摄像形式,大家需求创制四个它们的实例。如下

let someResolution = Resolution() 
let someVideoMode = VideoMode()
let someResolution = Resolution() 
let someVideoMode = VideoMode()

 

 

 过那种方法所创办的类依旧结构体实例,其属均会被伊始化为暗中同意值。

 过那种方法所创办的类如故结构体实例,其属均会被初叶化为暗许值。

 

 

  属性访问

  性格访问

行使点语法访问实例中所含有的属性。其语法规则是,实例名背后紧跟属性名,两者通过点号(.)连接:

选取点语法访问实例中所含有的质量。其语法规则是,实例名背后紧跟属性名,两者通过点号(.)连接:

println("The width of someResolution is \(someResolution.width)")
println("The width of someResolution is \(someResolution.width)")

 

 

 你也得以访问子属性,怎么样VideoMode中Resolution属性的width属性:

 你也得以访问子属性,怎么着VideoMode中Resolution属性的width属性:

println("The width of someVideoMode is \(someVideoMode.resolution.width)") 
println("The width of someVideoMode is \(someVideoMode.resolution.width)") 

 

 

 你也得以动用点语法为属性变量赋值

 你也能够应用点语法为属性别变化量赋值

someVideoMode.resolution.width = 12880 
println("The width of someVideoMode is now \(someVideoMode.resolution.width)") 
someVideoMode.resolution.width = 12880 
println("The width of someVideoMode is now \(someVideoMode.resolution.width)") 

 

 

 注意:与 Objective-C
语言分化的是,Swift允许直接设置结构体属性的子属性。上面包车型大巴终极叁个例子,正是一贯设置了someVideoMode中resolution属性的width这几个子属性,以上操作并不要求从新安装resolution属性。

 注意:与 Objective-C
语言分化的是,Swift允许直接设置结构体属性的子属性。上面的末段二个事例,正是直接设置了someVideoMode中resolution属性的width这些子属性,以上操作并不需求从新装置resolution属性。

 

 

   每种分子起先化器的构造类型

   每个分子初始化器的布局类型

 全数结构体都有1个自动生成的积极分子相继起头化方法,用于初步化新结构体实例中成员的习性。新实例中种种属性的开端值能够由此质量的名目传递到成员相继起头化器之中:

 全数结构体都有贰个自动生成的积极分子相继开头化方法,用于发轫化新结构体实例中成员的性质。新实例中逐条属性的初步值能够通过品质的称呼传递到成员相继初叶化器之中:

let vga = resolution(width:640, heigth: 480) 
let vga = resolution(width:640, heigth: 480) 

 

 

 与结构体分歧,类实例未有暗中同意的成员相继初始化器。

 与结构体分歧,类实例未有暗许的成员相继伊始化器。

 

 

  结构体和枚举是值类型

  结构体和枚举是值类型

个值类型是八个值,当它被分配给二个变量或常量时,或当它被传送给函数时,它的值是被复制的,那意味它们的实例,以及实例中所包括的别的值类型属性,在代码中传送的时候都会被复制。

个值类型是3个值,当它被分配给2个变量或常量时,或当它被传送给函数时,它的值是被复制的,那意味它们的实例,以及实例中所包罗的其它值类型属性,在代码中传递的时候都会被复制。

let hd = Resolution(width: 1920, height: 1080) 
var cinema = hd 
let hd = Resolution(width: 1920, height: 1080) 
var cinema = hd 

在上述示例中,评释了2个名称叫hd的常量,其值为二个开首化为全高清录像分辨率(1920像素宽,⑩80 像素高)的Resolution实例。

在上述示例中,注脚了一个名叫hd的常量,其值为3个伊始化为全高清摄像分辨率(1918像素宽,1080 像素高)的Resolution实例。

然后示例中又声称了八个名称叫cinema的变量,其值为事先宣称的hd。因为Resolution是八个结构体,所以cinema的值其实是hd的贰个拷贝副本,而不是hd本人。固然hd和cinema有着相同的宽(width)和高(height)属性,但是在后罗利,它们是四个完全差异的实例。

下一场示例中又声称了一个名称叫cinema的变量,其值为事先宣称的hd。因为Resolution是2个结构体,所以cinema的值其实是hd的三个正片副本,而不是hd自个儿。即使hd和cinema有着同样的宽(width)和高(height)属性,然而在后弗罗茨瓦夫,它们是三个完全分化的实例。

 

 

  类是引用类型

  类是引用类型

与值类型分歧,引用类型在被给予到二个变量,常量可能被传送到一个函数时,操作的并不是其拷贝。由此,引用的是已存在的实例本身而不是其拷贝

与值类型分歧,引用类型在被给予到1个变量,常量大概被传送到1个函数时,操作的并不是其拷贝。因此,引用的是已存在的实例本人而不是其拷贝

 

 

  恒等运算符

  恒等运算符

因为类是援引类型,有不小只怕有五个常量和变量在后台同时援引某二个类实例。要是能够看清三个常量可能变量是不是引用同2个类实例将会很有赞助。为了实现那几个指标,Swift内建了七个恒等运算符:

因为类是援引类型,有非常的大希望有四个常量和变量在后台同时引述某二个类实例。要是能够判明三个常量或然变量是不是引用同贰个类实例将会很有救助。为了达成那么些目标,Swift内建了多个恒等运算符:

等价于 ( === )

等价于 ( === )

不等价于 ( !== )

不等价于 ( !== )

if tenEighty === alsoTenTighty { 
    println("tenTighty and alsoTenEighty refer to the same Resolution instance.") 
} 
if tenEighty === alsoTenTighty { 
    println("tenTighty and alsoTenEighty refer to the same Resolution instance.") 
} 

 

 

 

 

  指针

  指针

  假使你有 C,C++ 也许 Objective-C
语言的经历,那么您大概会分晓那些语言使用指针来引用内部存款和储蓄器中的地点。1个Swift常量或然变量引用二个引用类型的实例与C语言中的指针类似,不相同的是并不直接指向内部存款和储蓄器中的某部地方,而且也不必要你选取星号(*)来表明你在开创一个引用。Swift中这几个引用与别的的常量或变量的概念格局相同。

  假诺你有 C,C++ 只怕 Objective-C
语言的阅历,那么您可能会分晓那一个语言使用指针来引用内部存款和储蓄器中的地点。多个Swift常量可能变量引用一个引用类型的实例与C语言中的指针类似,分化的是并不直接指向内部存款和储蓄器中的某部地点,而且也不必要你选择星号(*)来注明你在开立1个引用。Swift中那个引用与别的的常量或变量的概念格局相同。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有