前端之家收集整理的这篇文章主要介绍了
Swift语言 快速基础入门 (2),
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
404_0@
(文章出处:http://blog-cn.jiazhewang.com/swift%E8%AF%AD%E8%A8%80-%E5%BF%AB%E9%80%9F%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8-2/)
本文根据《The Swift Programming Language》一书 “A Swift Tour”章节进行了简单地翻译,并加入了一些我个人的实验记录和想法,以求用比较快的速度熟悉 Swift 语言的语法和特性。
本文内容分为两部分,本页是第(2)部分,第一部分请点此浏览:Swift语言 快速基础入门 (1)
对象和类 Objects and Classes
类
使用class关键字来声明一个类,关键字之后跟着的是类名。类的属性声明和常量以及变量的声明方式完全想通,唯一不同的是他们被声明在类的大括号内。同样的,方法和函数的声明也是如此。
|
class
Shape
{
var
numberOfSides
=
0
func
simpleDescription
(
)
->
String
{
return
"A shape with (numberOfSides) sides."
}
}
|
要创建一个类的实例,我们可以在类名后加上括号,比如下面例子中那样。我们可以使用“点语法”(dot Syntax)来直接访问实例的属性和方法。
|
var
shape
=
Shape
(
)
shape
.
numberOfSides
7
shapeDescription
.
simpleDescription
)
|
这个版本的 Shape 方法很不靠谱,因为缺少了一个很重要的东西:一个用来设置初始值的方法。我们通常称之为构造函数(constructor、initializer)。在 Swift 中,我们默认通过类中命名为init的方法来作为这个类的构造函数。
1
2
3
4
5
6
7
8
9
10
11
12
NamedShape
{
var
numberOfSides
: Int
0
name
: String
init
(
name
: String
{
self
.
name
name
}
{
"A shape with (numberOfSides) sides."
}
@H_842_ 301@注意 self是如何被用来区分 name 这个类的 属性和 name 这个参数的。第6行中,后面的name 是 init 这个构造 函数的参数,而这个参数被传给了 self.name 这个类的 属性。
当你创造一个实例的时候,像函数调用参数一样直接给构造器直接传入参数。每一个类的属性都要被赋值,不管是通过直接声明的方式(就像 numberOfsides)还是通过构造函数(就像name)。
如果你还需要在删除对象之前进行一些清理工作,可以使用命名为deinit的类内方法来创建一个析构函数(deinitializer)。
继承——子类和父类
声明子类的方式是在其类名后面写一个冒号,后面跟上父类的名字。由于没有必要继承任何标准的根类,所以我们可以根据实际需要来选择继承或者省略父类。
子类中的方法如果重写了父类的方法,在声明前加关键字override来标明。如果没有标明的话,会被编译器报错。编译器同样会检测标明了重写但是实际根本没有重写的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class
Square
: NamedShape
{
var
sideLength
: Double
init
(
sideLength
: Double
,
name
: String
)
{
self
sideLength
sideLength
super
name
: name
)
4
}
func
area
->
Double
{
return
sideLength
*
sideLength
}
override
String
{
"A square with sides of length (sideLength)."
}
}
let
test
Square
(
sideLength
:
5.2
Crayon-sy" style="border:0px; font-family:inherit; font-size:inherit!important; font-style:inherit; font-weight:inherit!important; margin:0px; outline:0px; padding:0px; vertical-align:baseline; height:inherit; line-height:inherit!important; color:rgb(51,
name
"my test square"
)
test
)
Getter 和 Setter
对于一些简单的属性,可以设置 getter 和 setter。比如下面例子中的 perimeter。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class
EquilateralTriangle
: NamedShape
{
sideLength
: Double
0.0
sideLength
: Double
,
{
sideLength
sideLength
super
.
: name
)
3
}
perimeter
{
@H_ 403_653@
get
{
3.0
*
sideLength
}
set
{
newValue
/
3.0
}
}
override
{
"An equilateral triagle with sides of length (sideLength)."
}
}
triangle
EquilateralTriangle
(
sideLength
:
3.1
Crayon-sy" style="Box-sizing: border-Box; border: 0px; font-family: inherit; font-size: inherit !important; font-style: inherit; font-weight: inherit !important; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; height: inherit; line-height: inherit !important; color: rgb(51,
name
"a triangle"
)
triangle
perimeter
perimeter
9.9
sideLength
|
class
Counter
{
count
: Int
0
incrementBy
amount
: Int
numberOfTimes
times
{
count
+=
amount
times
}
}
counter
Counter
)
counter
(
2
numberOfTimes
7
这个例子中,incrementBy 是一个方法,它有两个参数。第一个参数叫做 amount,在调用的时候,由于是第一个参数,所以直接传入2。第二个参数对外叫做 numberOfTimes,在调用的时候需要写 numberOfTimes:7来传入7,而对内的时候有一个自定义的名字叫做 times,所以方法内部代码直接使用了 amount*times。这样的好处是,写方法的时候使用较精简的自定义的参数名可以简化编程过程,而调用方法的时候使用较为详细的参数名可以方便理解参数的意义。
可选值
当使用可选值时,你可以在方法、属性或者子脚本之前加上一个问号?。这样的话,如果问号前的值是 nil,那么问号之后的所有内容都会被忽略,然后整个表达式返回的是 nil。否则,如果问号前的值存在,那么问号后的代码会被运行。这两种情况下,真个表达式的值也都是一个可选值。
|
let
optionalSquare
: Square
?
Square
2.5
"optional square"
)
let
optionalSquare
?
枚举和结构 Enumerations and Structures
枚举
使用关键字<span #d333f5;"="" style="Box-sizing: border-Box; border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">enum来创建一个枚举。如同类和其他所有被命名的类型一样,枚举可以拥有自己的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
enum
Rank
{
case
Ace
1
Two
Three
Four
Five
Six
Seven
Eight
Nine
Ten
Jack
Queen
King
{
switch
self
{
.
Ace
:
return
"ace"
Jack
:
"jack"
Queen
:
"queen"
King
:
"king"
default
:
String
(
toRaw
)
)
}
}
}
ace
Rank
// (Enum Value)
aceRawValue
ace
// 1
aceDescribe
// "ace"
|