swift基本语法
五种类型
枚举(enum),结构体(struct),类(class),协议(protocol),函数(function types)
枚举和结构体属于值类型(value type),类和函数类型属于引用类型(reference type),而协议是抽象接口类型,属于值类型还是引用类型取决于它所引用的实例.
元组(tuple):对数据组织的容器,可以看作复合类型.
类型安全
1.可选型Optional
swift可以给任一类型对应的optional置空(nil),不像其它语言只能给指针或者引用类型的对象置空,而不能对值类型的对象置空.像C语言函数查找一个内容是否存在经常使用-1代表不存在,而没有像swift直接返回空这样,使API更加统一,直观.
2.没有隐式类型转换
任意两种不同的类型无法进行隐式转换,一般需要通过目的类型的构造器进行显式转换
变量与常量
变量用关键字var进行声明,而常量用关键字let进行声明
1.变量
如果一个变量对象的类型是枚举或结构体类型(即值类型),那么该对象自身的值允许被修改,且其成员变量也能被修改。如果一个变量对象的类型是类类型(即引用类型),那么该对象引用可以被修改,且该对象所引用的对象实例中的所有成员变量也能被修改。
2.常量
如果一个常量对象的类型为一个枚举或一个结构体类型,那么该对象的值,包括其所有成员的值都不允许被改变。如果一个常量对象的类型是一个类类型,那么该对象引用不能被改变,但它所引用的对象实例中的所有成员变量允许被修改.
3.在swift中,基本数据类型(整数,浮点数,字符串,字典,数组等)都是结构体类型,即为值类型,通过字面量或者直接构造的对象都属于常量,不能对实例的属性进行修改;而类类型直接创建的对象实例则可对其实例属性进行修改
4.swift允许一个常量先声明再被初始化,但只能被初始化一次,如果一常量被初始化之后再给它赋值,编译器会报错.
对象类型与类型标注
1.类型推导
直接用赋值操作符(assignment operator) = 声明一个对象并进行初始化,编译器会根据 = 右边对象的类型自动推导出 = 左边对象的类型.
2.一条声明语句声明多个对象
Swift中在一条声明语句中可以一次声明多个对象。通过逗号将声明的各个对象分隔开.
let a:Int,b:Double,c:String,d:20.0
3.类型标注(Type annotations)
通过冒号:显式的指定对象的类型
下划线
1.通配符 _,单独一条下划线,表示通配符(wildcard),一般用于对象声明中表示一个缺省对象.比如,不需要函数的返回值时,或者萃取元组时,不需要某些成员都可以用下划线来表示
func foo() ->Int{
return 10
}
let _ = foo()
_ = foo()
let (a,_,c) = (1,4,"abc")
语句与表达式
语句(statements),表达式(expressions)
1.一条语句末尾不需要跟一个分好,而是直接可以用换行符分割,当然可以用分好作为语句分隔符,swift中,用于分割语句的只能是换行符和分好,不能是其他符号,}不属于语句分隔符(C语言中可以作为).
2.C语言中几乎任一表达式都能单独作为一条语句,而Swift则完全相反——Swift编程语言中大部分表达式都不能作为完整的语句,尤其是返回类型不是 Void 的表达式,往往会出现编译报警。此时,我们需要将它们转为通配符表达式以消除警告.
以下表达式单独用作语句则会直接引发编译报错:直接以对象标识符或函数标识符作为基本表达式使用,闭包表达式,圆括号表达式与元组表达式中存在单一的对象或函数标识符,隐式成员表达式。
func foo() {
}
var a = 1, b = 2
a // 编译器错误:表达式解决为一个未被使用的左值
foo // 编译错误:表达式解决为一个未被使用的函数
({
print("hello")
}) // 编译错误:表达式解决为一个未被使用的函数
(a) // 编译器错误:表达式解决为一个未被使用的左值
(a, b) // 编译器错误:表达式解决为一个未被使用的左值
//我们可以通过通配符表达式来消除编译错误。而对于闭包表达式与表示函数标识符的表达式,也可以直接通过函数调用表达式的形式来消除错误。
_ = a
_ = foo
foo()
_ = {
print("hello")
}
( {
print("hello")
})()
_ = (a)
_ = (a,b)
标识符
标识符:identifier,编程语言中用于指代一个对象或一个类型的名字。由于Swift代码文本基于Unicode,因此我们可以使用UTF-16与UTF-8编码中大部分字符对一个对象或类型进行命名
1.命名规则:
1)标识符中不能含有空白符(包括换行符、空格、制表符等)、数学符号、箭头、私有使用(或无效)的Unicode码点(code point)以及与画线、画边框有关的符号(除了下划线)。
2)不允许以数字打头,但数字可以包含在一个标识符的其他位置。
3)在ASCII字符集中,除了下划线与 $,其他非数字、非字母符号均不能用于标识符。
- 标识符不能以 $ 打头,也不允许以单一的 $ 作为标识符,但允许 $ 放在标识符的其他位置。
2.Swift编程语言允许在某些场合使用自己的关键字来作为标识符,比如作为函数的参数标签
// 这里可以使用in、for等关键字作为参数标签名,
// 但不能使用inout作为参数标签名
func foo(in: Int, for: inout Int) {
}
3.Swift中可以通过对关键字前后加符号作为标识符来使用,
符号除了关键字外,还可以摆放其它合法标识符,但还是不允许摆放非法标识符的
注释
单行注释: //
断注释: /**/,可以进行成对嵌套
1.Markup格式化文档的时候必须注意,必须使用三条斜杠,Markup中具有许多参数可生成高亮格式的文字,在使用参数时,必须在参数前加一个 - 号,然后在参数名后加冒号,再跟描述文字。其中, - 号与参数名之间必须要用一个空格分隔,而冒号与参数名之间不需要任何空白符。
/// 这是一个结构体。
///
/// 它什么都没干……
/// - important: 这很重要!
/// - warning: 警告!
/// - attention: 注意!
/// - note: 另外……没什么好说的了……
/// - version: 1.0
/// - author: ooxx
struct MyStruct {
}
2.方法格式化文档
parameter:这个参数后面引入当前函数的形参说明。如果形参同时还包括命名的参数标签,那么说明一般针对形参名而不是参数标签名。
parameters:这个参数下面可以跟多个形参描述。
returns:这个参数后面可以对当前函数的返回值进行描述。
throws:这个参数后面可以描述当前函数可能会抛出某种异常。
/// 这是一个函数
/// 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)
}
3.像Objective-C中用于代码分段的 #pragma mark - 在Swift中是通过注释方式来实现的。因为Swift中没有 #pragma 预处理器指示符,所以使用 // MARK: 来表示标记分段
//MARK:
//TODO:
//FIXME: