学习目标:
一、学习Swift简单数据类型,并了解不同数据类型的区别。
二、熟悉Swift语言中的常用控制流方法。
三、学会编写函数来解决实际问题。
四、在程序中使用复杂数据类型。
2.1 语法入门
2.1.1 变量与常量
在Swift语言中声明变量使用var关键字,声明常量使用let关键字。
var str = "hello world" //变量
let instration = 2 //常量
声明变量或者常量需要注意一下几点:
1.声明时类型是可选的,如果在声明时没有指定类型且对变量赋予了初值,编译器会自动推断常量或者变量的类型,这种机制被称为“类型推断”。
2.当成功声明某个变量或者常量之后,不能再声明相同名字的其他变量或者常量,并且声明成功后变量和常量不能相互转化。
3.Swift语言允许我们在每一行结尾处省略分号“;”分隔符,但如果在同一行有两个甚至多个表达式,请在每个表达式后面都加上分号。
4.Swift语言将具体某种类型的值称为类型字面量,比如“2.8”就是浮点类型字面量。
2.1.2 整型
Swift语言拥有继承自C语言的有符号整型Int 、Int8、Int16、Int32、Int64,以及无符号整型UInt、UInt8、UInt16、UInt32、UInt64。其中需要注意的是Int和UInt类型的字长始终和当前平台的原生字长相同。
每个数据类型都有自己可以表示或者存储值得固定范围。可以用句点访问法访问对应类型的取值范围。如下所示:
UInt8.min //0
UInt8.max //255
整型变量的声明如下:
var tempInt:Int //规范的声明方式
var tempInt1 = 12 //隐式声明机制
var tempInt2 = Int.init(12) //显式声明机制
2.1.3 浮点型
拥有小数部分的数值字面量就是浮点数。Swift语言为我们提供了两种有符号浮点类型,Double和Float,Float是32位浮点数类型,Double是64为浮点数类型。需要注意:当你使用类型推断声明一个浮点型变量或者常量的时候,变量或者常量总是默认被推断为Double类型。
浮点型变量的声明如下:
var tempDouble:Double
var tempVlue = 1.68 //类型被推断为浮点型(Double)
如果担心将Double和Float两种类型的字长混淆,你可以直接使用它们的类型别名,定义如下:
typealias Float32 = Float
typealias Float64 = Double
var temp:Float32
2.1.4 布尔型
在Swift语言中,布尔型只有两种值:“true”和“false”。声明布尔类型如下:
var tempBool:Bool
var tempBool1 = false
print(tempBool1.description) //通过访问description属性输出字符值
if !tempBool1 {} //在if判断语句中使用布尔类型变量作为条件
var temp1 = 3
while temp1>=0{} //在控制流while中使用表达式的布尔值作为条件
2.1.5 字符串和字符
Swift语言主要使用String和Character来存储字符数据。String是字符串类型,Character是字符类型,一个或多个字符组成一个字符串。
2.1.5.1 字符串
字符串是一个有数字、字母、下划线和其他符号组成的一串字符集合。字符串的声明如下:
var tempStr:String
var tempStr1 = "someNote"
if tempStr1.isEmpty {
print(tempStr1);
}
//字符串连接操作只需要简单地通过“+”号将两个字符串连接即可
tempStr = "smomeNote" + "is not null"
注意:Swift中不能直接将字符串作为字符数组那样通过使用下标访问指定字符。
Swift语言支持字符串插值,你可以在长字符串中插入常量、变量、字面量和表达式。例如:
let gameName = "2048"
print("hello my program name is\(gameName)")
Swift语言使用值传递作为默认字符串拷贝方式,无论何时,传递的都将是值的拷贝。
2.1.5.2 字符
在Swift语言中表示字符使用Characters类型,其声明格式如下:
//请注意加上类型名称,否则变量会被推断为String类型
var tempCharacter:Character
var tempCharacter1:Character = "a"
Swift语言推荐我们使用countElements函数获取字符串中的字符数量,如下:
let tempStr2 = "My name is Wangzheguilai"
print("tempStr2 has \(countElements(tempStr2)) characters")
但是countElements需要遍历字符串中每一个字符的长度来进行计算,效率比较低。通过countElements返回的字符数量并不总是与包含相同字符的NSString的length属性值相同。
2.1.5.3 字符串和字符的常用操作
字符串和字符的常用操作包括连接、比较、复制、插入、删除。
1.连接两个字符串只需要用加号(+)运算符就能将两个字符串连接在一起。
需要注意的是,字符变量只能包含一个字符,所以不能对字符变量赋予超过一个字符长度的值。同时,和字符串不同,Swift也不允许我们直接通过使用加号“+”连接两个字符来生成新字符。
2.比较字符串是否相等可以使用“==”操作符,如果两个字符串包含字符相同、顺序相同则比较结果为true。
通过调用String类型的hasPrefix/hasSuffic方法来检查字符串是否拥有特定的前缀/后缀,从而得出两个字符串是否前缀/后缀相等。String类型拥有uppercaseString和lowercaseString两个属性。你可以使用它们来访问一个字符串的大写/小写版本。
2.1.5.4 Unicode
和ASCll一样,Unicode是一种跨语言、跨平台的文本编码国际标准,Unicode的第十万个字符在2005年被引入且成为标准之一,我们可以用Unicode表示来自任意语言几乎所有的字符。使用Unicode兼容的三种编码方式(UTF-8、UTF-16、UTF-32)访问字符串的Unicode。
2.1.5.5 字符串输出
计算机程序通常是指由一组约定格式的输入通过算法处理产生特定的输出的有序指令序列,在Xcode的命令行程序中,通常使用print函数控制输出。
2.1.5.6 值类型和引用类型
在Swift语言中,所有的类型都可以被分为“值类型” 和 “引用类型”。值类型和引用类型是一个相对的概念,其中的差别就在于:对新的对象产生赋值等指向性的操作之后,再次操作赋值对象或被赋值对象是否会同步于另外一个对象。
在Swift语言中,大多数类型都是值类型的,但是也有一些特殊情况,比如你可以在函数参数定义中使用inout关键字将参数定义为引用类型。
2.1.6 可选(optional)
可选是指当一个变量、常量或者其他类中存储幼稚的时候返回里面存储的值,没有值得时候返回nil。可选的标准声明形式是在程序中适用类型名紧跟“?”,如下:
var tempValues1:Optional<Int> //显示声明
var tempValues:Int? //隐式声明
print("the value is \(tempValues?.description)") // the value is nil
在实际编码过程中,我们经常会使用一种叫作可选绑定的方式来保证安全的unwarp。如下所示:
//可选绑定
var optionalValue:Optional<Int>
if var MaxValue = optionalValue{
MaxValue += 1
print("The convert Value is \(MaxValue)")
}
如果当你确定这个可选类型的变量中肯定包含值的时候,可以使用名称紧跟“!”的方式强制获取类型可选中的值,从而省略判断的步骤,但是如果这个变量中没有值,使用强制解析可选可能会在运行期弹出异常。这种机制叫做“强制解析可选”。
注意:
1.在OC中,nil表示的是一个指向不存在对象的指针,而Swift中表示空的关键字为“nil”,他没有其他含义。
2.可选类型的变量或者常量在有值的时候返回值,没有值得时候不会返回任何东西,包括false.
3.nil不能用于非可选的常量或者变量,如果你的代码中可能会出现没有值的情况,请务必声明其为可选类型。如果你声明了一个可选常量或者变量没有初始化,程序会默认赋值为nil。
隐式解析可选用于一个确定会有值得可选类型实例声明。你可以将可选变量声明中的“?”改为“!”来标注一个隐式解析可选。隐式解析可选可以直接访问隐式解析变量或常量的值,就如同使用普通变量一样,不需要加上特殊符号。
可选运算符:“??”,其执行逻辑为:当运算符当操作数a为nil时表达式返回操作数b的值,当运算符当操作数a不为nil时表达式则返回操作数a的值。例如:
var avalue:Int?
var bvalue = 1
var returnValue = avalue ?? bvalue
print(returnValue)