Swift基本语法

2018-09-20  本文已影响7人  曹来东

Swift编程语言仅包含五种类型

变量类型

通过var声明的对象称为变量对象,简称变量.

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声明的对象称为常量对象,简称常量.

//声明一个整数对象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中除了一般整数,浮点数,字符串,数组,字典等结构体类型的字面量属于常量之外,structenum直接构造出的对象也属于常量,我们不能直接对由这些类型构造出的对象实例做实例属性的修改.

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中的下划线

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中将语句分为三大类:

Swift中将表达式分为四大类:

Swift编程语言与C语言不同的是,C语言中几乎任一表达式都能单独作为一条语句,而Swift则完全相反.Swift编程语言中大部分表达式都不能作为完整的语句,尤其是返回类型不是Void的表达式,往往会出现编译报警。此时,我们需要将它们转为通配符表达式以消除警告.

Swift中的标识符

所谓标识符(identifier)是编程语言中用于指代一个对象或一个类型的名字。由于Swift代码文本基于Unicode,因此我们可以使用UTF-16与UTF-8编码中大部分字符对一个对象或类型进行命名.

标识符命名规则:

此外,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() {
 

然后我们在函数分栏中可以看到下图效果:

image.png
除了 // MARK:之外,还有 // TODO:以及 // FIXME:
注意冒号后面有空格
上一篇下一篇

猜你喜欢

热点阅读