NapoleonBai 2020-05-01
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)成单独的常量和变量,然后可以正常使用了。
可选类型:
使用可选类型(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时这条信息会被显示。