swift1-基础

Swift包含了C和Objective-C上所有基础数据类型,Int表示整型值、Double和Float表示浮点型值、Bool是布尔型值、String是文本型数据。Swift还提供了三个基本的集合类型:Array、Set和Dictionary。

Swift还提供了OC中没有的高阶数据类型比如元组Tuple。元组可以让你创建或者传递一组数据,元组的数据类型不必一致。

Swift还增加了可选(Optional)类型,用于处理值缺失的情况。可选表示一个变量可以有一个值或者没有值。

Swift是一种类型安全的语言,Swift可以让你清楚地知道值的类型。如果你的代码期望得到一个String,类型安全会阻止你不小心传入一个Int。同样的,如果你的代码期望得到一个String,类型安全会阻止意外传入一个可选的String。类型安全帮助在开发阶段尽早发现错误。

常量和变量:

常量和变量把一个名字和一个指定类型的值关联起来。常量的值一旦设定就不能改变,而变量的值可以随意更改。

声明常量和变量:

常量和变量必须在使用前声明,用let声明常量,用var声明变量。

类型标注:

当声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存出的值得类型。var a:Int=1

可以在一行中定义多个同样类型的变量,用逗号分隔,并在最后一个变量名之后添加类型标注。

var a,b,c:String

常量和变量的命名:

可以用任何你喜欢的字符作为常量和变量名,包括Unicode字符。

常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其它地方包含数字

一旦将常量或者变量声明为确定的类型,就不能使用相同的名字再次声明,或者改变其存储的值的类型。同时,不能将常量与变量进行互转。

输出常量和变量:

可以用print(_:, separator:, terminator: )函数来输出当前常量或变量的值。

separator和terminator参数具有默认值,因此调用这个函数的时候可以忽略它们。默认情况下,该函数通过添加换行符来结束当前行。如果不想换行,可以传递一个空字符串给terminator参数,例如print(a,terminator:" ")。

Swift使用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在括号前使用反斜杠将其转义:

var b:String="from a \(a)"

注释:

Swift中的注释与C语言的注释非常相似。单行注释以双正斜杠(//)作为起始标记。

也可以用/*和*/来注释一大段内容。

注释可嵌套。

分号:

Swift并不强制要求在每条语句的结尾处使用分号(;),不过也可以添加。

有一种情况必须使用分号,即打算在同一行内写多条独立的语句:var a=1;var b="cjj"

整数:

整数就是没有小数部分的数字,42、-53。整数可以有符号(正负零)或者无符号(正零)。

Swift提供了8、16、32和64位的有符号和无符号整数类型。这些整数类型和C语言的命名方式很像,比如8位无符号整数类型是UInt8,32位有符号整数类型是Int32。

整数范围:

可以访问不同整数类型的min和max属性来获取对应类型的最小值和最大值。

let a=UInt8.min

let b=UInt8.max

min和max所传回值的类型,正是其所对应的整数类型,可用在表达式中相同类型值旁。

Int:

一般来说不需要专门指定整数的长度。Swift提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同:

在32位平台上,Int和Int32长度相同。

在64位平台上,Int和Int64长度相同。

UInt:

与Int对应的无符号整数。

浮点数:

有小数部分的数字。

Double表示64位浮点数。Float表示32位浮点数。

类型安全和类型推断:

Swift是一个类型安全的语言(type safe)。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果代码需要一个String,传入Int会编译出错。

类型检查(type checks)在编译时期进行,并把不匹配的类型标记为错误。

如果在声明常量和变量时未显式指定类型,Swift会使用类型推断(type inference)来选择合适的类型。

当声明常量或者变量的时候赋给一个字面量(literal value或literal)即可触发类型推断。

类型推断的浮点数默认是Double。

数值型字面量:

整数字面量可以被写作:

一个十进制数,没有前缀;一个二进制数,前缀是0b;一个八进制数,前缀是0o;一个十六进制数,前缀是0x。

浮点字面量可以是十进制(没有前缀)或者是十六进制(前缀是0x)。小数点两边必须有至少一个十进制数字(或者是十六进制的数字)。

var a:Double=0x98.34p0  //十六进制表示的浮点数字面量必须有p,且0x在开头。

十进制浮点数也可以有一个可选的指数(exponent),通过大写或者小写的e来指定;十六进制浮点数必须有一个指数,通过大写或者小写的p来指定。

如:0xFp2表示15乘于2的2次方,等于60.0。

0xFp-2表示15乘于2的-2次方,等于12.1875。

整数转换:

不同整数类型的变量和常量可以存储不同范围的数字。Int8类型的常量或者变量可以存储的数字范围是-128~127,而Uint8类型的常量或者变量能存储的数字范围是0~255。如果数字超出了常量或者变量可存储的范围,编译的时候会报错。

整数和浮点数转换必须显式指定类型。var a:Double=Double(10)  //

当用这种方式来初始化一个新的整数值时,浮点值会被截断。4.75会变成4,-3.9会变成-3。

类型别名:

类型别名(type aliases)就是给现有类型定义另一个名字。可以使用typealias关键字来定义类型别名。

typealias AudioSample=UInt16

var a:AudioSample=10

布尔值:

Swift有一个基本的布尔类型(Boolean),叫做Bool。布尔值指逻辑上的真假。布尔常量有两个true和false。

(Swift中的条件语句需要使用Bool类型表达式,没有0和非0的默认转换Bool)。

元组:

元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。

如(100,"cjj")是一个(Int,String)类型的元组。

可以把任意顺序的类型组合成一个元组,这个元组可以包含所有类型。

可以将一个元组的内容分解(decompose)成单独的常量和变量,然后可以正常使用了。

var a=(100,"cjj")
var (c,d)=a
 

可选类型:

使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示:

-有值,等于x

-没有值

在Swift中,字符串可转换为Int,但不是所有字符串都可以成功转换为整数。

var a="123"

var b=Int(a)

b的类型是Int?,问号表示该变量或常量是一个可选类型,也就是说可能包含Int值也可能不包含值。(如“123”可以成功转换,转换后的值是Optional(123),“123m”不能成功转换,转换后的值是nil)

nil:

可以给可选变量赋值为nil来表示它没有值:

var a:Int?=404

a=nil

如果声明了一个可选常量或者变量但没有赋值,它们会自动被设置为nil:

var a:Int?

if语句以及强制解析:

可以使用if语句和nil比较来判断一个可选值是否包含值。你可以使用“相等”(==)或“不等”(!=)来执行比较。

如果可选类型有值,它将不等于nil。

当确定可选类型确实包含值之后,可以在可选的名字后面加一个感叹号(!)来获取值。这个!表示“我知道这个可选有值,可以使用它。”这被称为可选值的强制解析(forced unwrapping)。

if a != nil{

print("\(a!)")

}

可选绑定:

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在if和while语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。

if let b = a{

...

}  //a是可选类型,如果其值不是nil,就创建一个临时变量b并将a的值赋给b,执行代码。a的值是nil时不会创建也不会执行。

隐式解析可选类型:

可选类型暗示了常量或者变量可以没有值。

有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。

这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped options)。把想要用作可选的类型的后面的问好(String?)改成感叹号(String!)来声明一个隐式解析可选类型。

let a:String?="cjj"

let b:String=a!  //需要用感叹号来获取值

let c:String!="xyy"

let d:String=c  //不需要感叹号

错误处理:

可以使用错误处理(error handling)来应对程序执行中可能会遇到的错误条件。

相对于可选中运行值的存在与缺失来表达函数的成功与失败,错误处理可以推断失败的原因,并传播至程序的其它部分。

当一个函数遇到错误条件,它能报错。调用函数的地方能抛出错误消息并合理处理。

用throw抛出错误,用try执行可能抛出错误的程序,用catch捕获错误。

所有的错误对象继承自Error协议。

断言:

使用断言进行调试:

断言会在运行时判断一个逻辑条件是否为true。从字面意思来说,断言“断言”一个条件是否为真。可以使用断言来保证在运行其它代码之前,某些重要的条件已经被满足。如果条件判断为true,代码运行会继续进行;如果条件判断为false,代码执行结束,程序终止。

使用全局assert(_:,_:,file:,line:)函数来写一个断言。向这个函数传入一个结果为true或者false的表达式以及一条信息,当表达式的结果为false时这条信息会被显示。

相关推荐