Swift编程语言仅包含五种类型
- 枚举(
enum
) - 结构体(
struct
) - 类(
class
) - 协议(`protocol)
- 函数类型(
function types
)
除此之外还有一个对数据组织的容器 - 元祖(
tuple
),是一种符合类型
其中enum
和struct
是值类型
;class
和function types``是引用类型
.而protocol
属于抽象接口类型
,它属于值类型
还是引用类型
取决于它锁引用的对象实例.这意味着当协议作为左值使用时完全属于引用类型
;但作为右值使用时就需要以它所引用的对象实例的具体类型来做判断了. -
Swift
中可以给任一类型对应的Optional
类型置空nil
;而在OC
C++
Java
等编程语言中只能给指针或引用类型的对象置nil
. - 出于安全考虑:
Swift
中不允许struct
类型有继承特性.
变量类型
通过var
声明的对象称为变量对象
,简称变量.
- 如果一个变量对象的类型是
enum
或struct
类型(即值类型),那么该对象自身的值允许被修改,且奇成员变量也能修改. - 如果一个变量对象是
class
类型(引用类型),那么该对象锁引用的对象实例中的所有成员变量也能被修改.
var a = 10//声明一个整型变量a
a = 100 // a允许被修改
//定义一个struct
struct S {
var s = 0//声明一个成员变量s
}
var b = S()//b声明为一个S结构体的变量对象
b = S ()//b可以被修改,赋新值
b.s = 10//b的成员变量s可以被修改.因为b的成员变量s使用var修饰的,是可变的
常量对象
使用关键字let
声明的对象称为常量对象
,简称常量
.
- 如果一个常量对象的类型为一个
enum
或struct
(值类型),那么该对象的值,和该对象的所有成员的值都不允许被修改. - 如果一个常量对象的类型是一个
calss
类型(引用类型),那么该对象引用不能被改变(不能修改指针),但他所引用的对象实例中的所有成员变量允许被修改
//声明一个整数对象a为一个常量
//其值不能修改
let a = 100
a = 10//编译报错,常量a不能被修改
struct S{
//声明一个成员变量s
var s = 0
}
let b = S()
b = S()//常量b不能修改
b.s = 20//常量b的成员变量也不能修改
//定义一个引用类型的calss
calss C{
var C= 0
}
let c = C()
c = C()//常量c不能被修改
c.c = 10//常量引用类型的成员变量是可以修改的
Swift
中除了一般整数,浮点数,字符串,数组,字典等结构体类型的字面量
属于常量之外,struct
和enum
直接构造出的对象也属于常量,我们不能直接对
由这些类型构造出的对象实例做实例属性的修改.
struct MyObject{
var a = 10,b = 1
}
var obj = MyObject()
//这条语句没问题 因为obj是一个变量
obj.a += obj.b
//直接用结构体类型构造出的对象是不可以修改的
//会编译报错
MyObject().a += 10
而对于类类型直接创建的对象实例,则可对其实例属性直接
进行修改
class Test {
var a = 10,b = 1
}
Test().a += Test().b
Swift
中允许一个常量先被声明再初始化,但只能初始化一次.如果一个常量被初始化之后再给他赋值,就会编译报错
let a : Int//声明,未初始化
let b = 10,c = 20
a = b + c //声明后 再对a初始化
对象声明与类型标注
-
Swift
中无论声明哪种类型的对象都只能用let
或var
. -
Swift
中编译器默认的浮点型数据是Double
不是float
Swift中的下划线
Swift
中单独的_
表示通配符
(wildcard
).一般用于对象声明中表示一个缺省对象.比如我们调用一个函数,该函数具有某种对象类型的返回值,我们如果不需要返回值就可以用下划线来声明一个哑对象dummy
.另外在萃取元祖`时,如果我们不需要堆某一远足的某些成员进行萃取,那么这些对象可以用下划线来表示.
//使用下划线声明了一个缺省Int类型的常量
let _ = 10
var _ = 0.5
//这里的var let甚至可省
_ = 0.5
//定义一个返回为Int类型的函数foo
func foo() -> Int{
return 10
}
如果我们不需要获取foo函数调用后的值.可以用哑对象.注意let _ = 不能省,会有警告
let _ = foo()
也可以
_ = foo()
定义一个具有(Int, Double, String)类型的元祖
let tuple = (1,1.0,"hello")
这里仅获取元组的第一个元素与第三个元素,而忽略第二个
let (a, _, c) = tuple
Swift中的语句与表达式
任何一种命令式变成语言都有语句statements
和表达式expressions
的概念.一条statement
相当于我们自然语言中的一句话,可表示一条完整的命令行执行.一条statement
可以由一个或多个expression
构成.
Swift
中将语句分为三大类:
- 简单语句 (声明和赋值语句 let var = )
- 编译控制语句
- 流程控制语句
Swift
中将表达式分为四大类:
- 前缀表达式(单目运算符 try操作符等)
- 双目表达式(双目操作符 三目操作符 类型投射操作符等)
- 基本表达式(所有字面量 self表达式 超类表达式 闭包表达式 圆括号表达式 元祖表达式 隐士成员表达式 通配符表达式 selector表达式 key-path表达式等)
- 后缀表达式(函数调用表达式 初始化器表达式 动态类型表达式 下标表达式 Optional链表达式等)
Swift
编程语言与C语言
不同的是,C语言
中几乎任一表达式都能单独作为一条语句,而Swift
则完全相反.Swift
编程语言中大部分表达式都不能作为完整的语句,尤其是返回类型不是Void
的表达式,往往会出现编译报警。此时,我们需要将它们转为通配符
表达式以消除警告.
Swift中的标识符
所谓标识符(identifier)是编程语言中用于指代一个对象或一个类型的名字。由于Swift代码文本基于Unicode,因此我们可以使用UTF-16与UTF-8编码中大部分字符对一个对象或类型进行命名.
标识符命名规则:
- 标识符中不能含有空白符(换行 空格 制表符等),数字符号,箭头,私有使用(或无效)的
Unicode
码点code point
以及画线,画边框相关的符号.(除了下划线) - 不允许以数字打头,但数字可以包含一个标识符的其他位置
- 在ASCII字符集中,除了下划线与 $,其他非数字、非字母符号均不能用于标识符。
- 标识符不能以 作为标识符,但允许 $ 放在标识符的其他位置。
此外,Swift编程语言允许在某些场合使用自己的关键字来作为标识符,比如作为函数的参数标签。
//这里可以使用 in for等关键字作为参数标签名
//但不能使用inout作为参数标签名
func foo(in : Int,for : inout){
}
不过我们在牵涉到关键字的时候需要注意,谨慎使用。当然,Swift中可以通过对关键字前后加 ` 符号作为标识符来使用。以下代码中的标识符都是合法的。
let `var` = 0
let `inout` = 0
let `hello` = 0
` 符号除了关键字外,还能摆放其他合法标识符。不过大家这里要注意的是,该符号中也是不允许摆放非法标识符的.
Swift中的注释
Swift
编程语言中的注释与C语言中的完全一样,可以使用以下段落注释的形式:
/**
* 这是一个注释段
*/
也可以使用行注释的形式:
// 这是一个注释行
Swift
编程语言也有类似于Objective-C
那种通过注释的方式给函数、类型等做文档化的格式(Objective-C
的注释文档化风格称为doxygen
风格)。Apple
官方将它称为Markup
格式,详细请见此链接.
在Markup
中一般习惯这么用:
/**
这是一条注释语句。
这又是一条注释语句。
- author: Laidong Cao
*/
func foo() {
}
而不是这么用:
/**
* 这是一条注释语句。
* 这又是一条注释语句。
* - author: Laidong Cao
*/
func foo() {
}
否则,在比较老的Xcode(比如Xcode 7)下在显示文档的时候会有些问题。使用行注释做Markup格式化的文档用得更多一些。我们可以看到,Apple官方的源代码注释也一般使用行注释来做Markup。
/// 这是一条注释语句。
/// 这又是一条注释语句。
/// - author: Laidong Cao
func foo() {
}
“这是一条注释语句。”与“这又是一条注释语句。”之间仅仅用了一个空格分隔。倘若我们要把这两条语句用一个换行符来分隔的话,那么我们可以插入一个空的注释行,如以下代码所示。
/// 这是一条注释语句。
///
/// 这又是一条注释语句。
/// - author: Laidong Cao
func foo() {
}
Markup中具有许多参数可生成高亮格式的文字,比如上图中的Author就是通过author
参数生成的。此外还有以下参数也是比较常用的:
1) attention:表示需要代码阅读者引起注意的地方。
1. important:表示这里的描述十分重要。
2. note: 表示标注,一般用于记载不怎么重要的事物,作为补充说明。
3. warning:表示十分紧要的内容,这部分可以说明如果某些接口误用会导致程序崩溃等非常致命的错误。
4.version:表示当前类型或函数的版本号。
在使用参数时,必须在参数前加一个 - 号,然后在参数名后加冒号,再跟描述文字。其中, - 号与参数名之间必须要用一个空格分隔,而冒号与参数名之间不需要任何空白符。下面我们看一个代码例子。
/// 这是一个结构体。
/// 这是一个结构体。
///
/// 它什么都没干……
/// - important: 这很重要!
/// - warning: 警告!
/// - attention: 注意!
/// - note: 另外……没什么好说的了……
/// - version: 1.0
/// - author: Zenny Chen
struct MyStruct {
}
上述代码例子,我们通过使用option键加鼠标左键点击MyStruct之后会出现下图所示的文档化描述对话框。
image.png
对于文档化注释来说,对每一个函数或方法的描述至关重要,因此我们在对函数或方法做格式化文档的时候可用的格式参数更多。下面我们例举一些常用的格式参数.
parameter:这个参数后面引入当前函数的形参说明。如果形参同时还包括命名的参数标签,那么说明一般针对形参名而不是参数标签名。
parameters:这个参数下面可以跟多个形参描述。
returns:这个参数后面可以对当前函数的返回值进行描述。
throws:这个参数后面可以描述当前函数可能会抛出某种异常。
下面我们来看两个例子。
/// 这是一个foo函数
/// - parameter obj: 一个整数对象
func foo(with obj: Int) {
}
/// 这又是一个foo函数
/// - parameters:
/// - a: 左操作数
/// - b: 右操作数
/// - throws: 可能会抛出异常
/// - returns: 返回一个Int类型的整数对象
func foo(a: Float, b: Float) throws -> Int {
return Int(a + b)
}
此外,像Objective-C中用于代码分段的 #pragma mark - 在Swift中是通过注释方式来实现的。因为Swift中没有 #pragma 预处理器指示符,所以使用 // MARK: 来表示标记分段。我们下面来举一个简单例子:
func myFunc() {
}
// MARK: foo函数
func foo() {
}
// MARK: test函数
func test() {
然后我们在函数分栏中可以看到下图效果:
除了
// MARK:
之外,还有 // TODO:
以及 // FIXME:
注意冒号后面有空格
网友评论