01.Swift基础语法
目录介绍
- 1.1 变量和常量
- 1.1.1 变量与常量的定义
- 1.1.2 变量命名
- 1.2 基本数据类型
- 1.2.1 整数类型
- 1.2.2 浮点数
- 1.2.3 布尔值
- 1.2.4 特殊类型
- 1.2.5 类型别名
- 1.2.6 类型安全
- 1.2.7 类型推断
- 1.3 字符和字符串
- 1.3.1 字符使用
- 1.3.2 字符串
- 1.3.3 转义字符
- 1.4 集合类型
- 1.4.1 数组Array类型
- 1.4.2 集合Set类型
- 1.4.3 字典Dictionary类型
1.1 变量和常量
1.1.1 变量与常量的定义
Swift 是一种类型安全语言,即常量或者变量在声明的时候必须指定明确的类型。
在使用变量前,你需要使用 var 关键字声明它,如下所示:
var variableName = <initial value>
以下是一个 Swift 程序中变量声明的简单实例:
var varA = 42
print(varA)
var varB: Float
varB = 3.14159
print(varB)
1.1.2 变量命名
变量名可以由字母,数字和下划线组成。
变量名需要以字母或下划线开始。
Swift 是一个区分大小写的语言,所以字母大写与小写是不一样的。
1.2 基本数据类型
1.2.1 整数类型
Int ,一般来说,你不需要专门指定整数的长度。Swift 提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同:
- 在32位平台上,Int和Int32长度相同。
- 在64位平台上,Int和Int64长度相同。
除非你需要特定长度的整数,一般来说使用Int就够了。这可以提高代码一致性和可复用性。即使是在32位平台上,Int可以存储的整数范围也可以达到-2,147,483,648~2,147,483,647,大多数时候这已经足够大了。
UInt ,Swift 也提供了一个特殊的无符号类型UInt,长度与当前平台的原生字长相同:
- 在32位平台上,UInt和UInt32长度相同。
- 在64位平台上,UInt和UInt64长度相同。
注意: 尽量不要使用UInt,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用Int,即使你要存储的值已知是非负的。统一使用Int可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断。
整数类型需要注意以下几点:
在 32 位系统上, Int 和 Int32 长度相同。
在 64 位系统上, Int 和 Int64 长度相同。
在 32 位系统上, UInt 和 UInt32 长度相同。
在 64 位系统上, UInt 和 UInt64 长度相同。
Int8, Int16, Int32, Int64 分别表示 8 位, 16 位, 32 位, 和 64 位的有符号整数形式。
UInt8, UInt16, UInt32, UInt64 分别表示 8 位, 16 位, 32 位 和 64 位的无符号整数形式。
1.2.2 浮点数
浮点数是有小数部分的数字,比如 3.14159,0.1 和 -273.15。
浮点类型比整数类型表示的范围更大,可以存储比 Int 类型更大或者更小的数字。Swift 提供了两种有符号浮点数类型:
- Double 表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
- Float 表示32位浮点数。精度要求不高的话可以使用此类型。
注意: Double精确度很高,至少有15位数字,而 Float 最少只有6位数字。选择哪个类型取决于你的代码需要处理的值的范围。
1.2.3 布尔值
Swift 有一个基本的布尔(Boolean)类型,叫做 Bool。布尔值指逻辑上的值,因为它们只能是真或者假。Swift 有两个布尔常量,true 和 false。
1.2.5 类型别名
类型别名对当前的类型定义了另一个名字,类型别名通过使用 typealias 关键字来定义。语法格式如下:
typealias newname = type
现在,我们可以通过别名来定义变量:
import Cocoa
typealias Feet = Int
var distance: Feet = 100
print(distance)
1.2.6 类型安全
Swift 是一个类型安全(type safe)的语言。
由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。
var varA = 42
varA = "This is hello"
print(varA)
以上程序,会在 Xcode 中报错:
error: cannot assign value of type 'String' to type 'Int'
varA = "This is hello"
意思为不能将 'String' 字符串赋值给 'Int' 变量。
1.2.7 类型推断
当你要处理不同类型的值时,类型检查可以帮你避免错误。然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型。
如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。
// varA 会被推测为 Int 类型
var varA = 42
print(varA)
// varB 会被推测为 Double 类型
var varB = 3.14159
print(varB)
// varC 也会被推测为 Double 类型
var varC = 3 + 0.14159
print(varC)
1.3 字符和字符串
1.3.1 字符使用
Swift 的字符是一个单一的字符字符串字面量,数据类型为 Character。
以下实例列出了两个字符实例:
let char1: Character = "A"
let char2: Character = "B"
// Swift 中以下赋值会报错
let char: Character = "AB"
print("char1 的值为 \(char1)")
print("char2 的值为 \(char2)")
Swift 的 String 类型表示特定序列的 Character(字符) 类型值的集合。 每一个字符值代表一个 Unicode 字符。
for ch in "Runoob" {
print(ch)
}
1.3.2 字符串
你可以通过使用字符串字面量或 String 类的实例来创建一个字符串:
// 使用字符串字面量
var stringA = "Hello, World!"
print( stringA )
// String 实例化
var stringB = String("Hello, World!")
print( stringB )
你可以将一个字符串赋值给一个变量或常量,变量是可修改的,常量是不可修改的。
// stringA 可被修改
var stringA = "菜鸟教程:"
stringA += "http://www.runoob.com"
print( stringA )
// stringB 不能修改
let stringB = String("菜鸟教程:")
stringB += "http://www.runoob.com"
print( stringB )
以上程序执行输出结果会报错,因为 stringB 为常量是不能被修改的:
error: left side of mutating operator isn't mutable: 'stringB' is a 'let' constant
stringB += "http://www.runoob.com"
1.3.3 转义字符
Swift 语言和C 语言类似,除了一些常规的可见字符外,其中还提供了一些有特殊用途的转义 字符,可通过特殊的符号组合来表示特定的意义。
1.4 集合类型
在Swift 语言中一共提供了3种集合类型: Array (数组)、Set (集合)和Dictionary (字典)。
- Array 类型是一种有序集合,放入其中的数据都有一个编号,且编号从0开始依次递增。通过编号, 开发者可以找到Array 数组中对应的值。
- Set 是一组无序的数据,其中存入的数据没有编号,开发 者可以使用遍历的方法获取其中所有的数据。
- Dictionary 是一种键值映射结构,其中每存入一个值 都要对应一个特定的键,且键不能重复,开发者通过键可以直接获取到对应的值。
1.4.1 数组Array类型
Swift 数组会强制检测元素的类型,如果类型不同则会报错,Swift 数组应该遵循像Array<Element>
这样的形式,其中Element是这个数组中唯一允许存在的数据类型。
如果创建一个数组,并赋值给一个变量,则创建的集合就是可以修改的。这意味着在创建数组后,可以通过添加、删除、修改的方式改变数组里的项目。如果将一个数组赋值给常量,数组就不可更改,并且数组的大小和内容都不可以修改。
数组的创建可以使用两种方式,一种是使 用 Array 的构造方法来创建,一种是使用中括号来快捷创建,示例如下:
//创建空数组
var arrayl = []
var array1 = [1,2,3]
var array2 = Array(arrayLiteral:1,2,3)
Swift 语言中Array 采用结构体来实现,对于大量重复元素的数组,开发者可以直接使用快捷 方法来创建,示例如下:
//创建有10个String 类型元素的数组,并且每个元素都为字符串"Hello"
var array3=[String](repeating:"Hello",count:10)
1.4.2 集合Set类型
Set 类型的集合不关注其中元素的顺序,但是其中的元素不可以重复,读者也可以将其理解为一个无序的集合。Set 集合在进行声明时必须指定其类型,或者对其进行赋初值, 使得编译器可以自行推断出Set 的类型。
var set1 : Set<Int> = [1,2,3];
var set2 = Set(arrayLiteral:1,2,3,4);
1.4.3 字典Dictionary类型
Swift 字典用来存储无序的相同类型数据的集合,Swift 字典会强制检测元素的类型,如果类型不同则会报错。
Swift 字典每个值(value)都关联唯一的键(key),键作为字典中的这个值数据的标识符。
和数组中的数据项不同,字典中的数据项并没有具体顺序。我们在需要通过标识符(键)访问数据的时候使用字典,这种方法很大程度上和我们在现实世界中使用字典查字义的方法一样。
Swift 字典的key没有类型限制可以是整型或字符串,但必须是唯一的。
如果创建一个字典,并赋值给一个变量,则创建的字典就是可以修改的。这意味着在创建字典后,可以通过添加、删除、修改的方式改变字典里的项目。如果将一个字典赋值给常量,字典就不可修改,并且字典的大小和内容都不可以修改。
以下是创建一个空字典,键的类型为 Int,值的类型为 String 的简单语法:
var someDict = [Int: String]()
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
对字典操作案例如下所示:
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
//可以根据字典的索引来访问数组的元素
var someVar = someDict[1]
print( "key = 1 的值 \(someVar)" )
//可以使用 updateValue(forKey:) 增加或更新字典的内容。如果 key 不存在,则添加值,如果存在则修改 key 对应的值。
var oldVal = someDict.updateValue("One 新的值", forKey: 1)
someVar = someDict[1]
print( "key = 1 的值 \(someVar)" )
//移除 Key-Value 对
var removedValue = someDict.removeValue(forKey: 2)