1.变量与常量
swift中使用var(variable)关键词来定义变量,使用let关键词来定义常量,例如:
var myNum = 10 // 定义一个Int类型的变量,它的值为10
let myStr = "Hello world" // 定义一个String类型的常量,它的值为"Hello World"
swift中的变量
变量中的存储值是可以改变的,在以上代码后加上:
myNum = 12
则变量myNum
的值就会由10改为12。
swift中的var
关键字与JavaScript中定义变量的var
长得一模一样,但它们本质上是截然不同的。JavaScript是一种弱类型编程语言,一个变量中可以存储任意类型的数据。但是swift是一种强类型编程语言,变量中的数据类型是固定的,相对来说更加安全。如果我们在定义变量的时候,没有为它明确指定类型,编译器会自动根据变量的值来推导它的类型。在Xcode中,按住option
键然后使用鼠标左键点击变量,会显示变量的类型:
如果我们想要明确地指定变量的数据类型,那么可以直接在变量后面使用冒号来标示它的类型,例如:
var myDouble: Double = 9.9
swift中的常量
常量中的值是不可以被改变的,如果我们试着改变常量中的值,例如在上面的代码后面添加以下语句:
myStr = "OK"
那么编译器会抛出一个错误,错误内容为:
Cannot assign to value: 'myStr' is a 'let' constant
(意思大致为:无法为常量'myStr'赋值)
当常量中的值为基础类型时,swift与Java表现基本一致。但如果常量中的值是引用类型,那么这两种语言会有一些差别。在Java中,常量指向的对象不可被改变,但是对象的值可以改变。而swift中常量指向的对象不能被改变,且该对象的值也不可改变。例如在Java中这样是正确的:
final ArrayList<String> myArr = new ArrayList<>();
myArr.add("Hello");
myArr.add("World");
// 最终myArr的值为["Hello", "World"]
而在swift中,以下的代码是错误的:
let myArr:[String] = []
myArr.append("Hello") // !报错,错误内容:Cannot use mutating member on immutable value: 'myArr' is a 'let' constant
2.数据类型
swift中常用的数据类型可以分为三种,分别为数值型、字符型以及复合类型
1-数值型
swift中的数值分为整数(整型)与小数(浮点型)两种类型。
在swift中,这两种类型之间是不能直接进行数据运算的,例如我们平时自然而然地会把整数与小数相加,例如1+0.1=1.1
。但swift中如果你将一个整型变量与一个浮点型变量相加,那么Xcode会抛出一个错误。在大多数的计算机语言中,整型数据都是不可以直接跟浮点型数据进行直接运算的,这是由于两者在计算机内部存储的方式不同而导致的,在此我们不进行深入考究。如果我们需要将整型与浮点型数据进行数据运算,那么可以将整型的数据转化为浮点型数据再运算。例如:
let myInt = 10
let myDouble = 2.2
let result = Double(myInt) + myDouble // result为浮点型,值为12.2
整型
swift中的整型根据长度可以分为8
、16
、32
以及64
四种,根据是否带符号分为Int与UInt(不可为负数)两种。两相结合,swift中的整数类型一共有Int
、Int8
、Int16
、Int32
、Int64
、UInt
、UInt8
、UInt16
、UInt32
以及UInt64
一共10种。其中Int
与UInt
是一种简写,在32位系统中,它们的长度是32位;在64位的系统中,它们的长度是64位。
如果没有特别的需求,我们平时直接使用Int
这种类型即可,这也是编译器默认的Int
类型。如果是有特殊的要求,可以再进行深入探究。
浮点型
浮点型也就是我们常说的小数,主要分为Double
与Float
两种,我们直接使用Double
即可。同时Double
也是swift编译器默认的小数类型。
数据运算
待更新..
2-布尔类型
布尔Bool
类型可以说是最简单的一种类型了,只有两个值true
和false
,通常用来验证两个数据是否相等。我们使用一个等号=
来给变量或者常量赋值,使用两个等号==
来进行数据比较,例如:
let ageOfTom = 15
let ageOfJohn = 17
let ageOfLily = 17
print(ageOfTom == ageOfJohn) // 结果为false
print(ageOfJohn == ageOfLily) // 结果为true
let myHobby = "fishing"
let name = "fishing"
print(myHobby == name) // 结果为true
myHobby.elementsEqual(name) // true
值得一提的是,与Java中的字符串比较需要比较两个变量的内存地址不同,swift中如果两个字符串中的字符完全相同,那它们就是相等的。除了判断两个数据是否相等,我们还可以判断两个数据是否不相等!=
,以及一个数是否大于>
(以及大于或等于>=
)或者小于<
(以及小于或等于<=
)另一个数。
另外一点需要注意的是,在Java或者JavaScript中,我们可以直接使用另一种数据类型来进行进行非空判断,例如在if - else
语句中,编译器会自动将0转化为false
进行运算。而swift中任何其他类型都不会被隐式地转化为布尔类型,需要我们显示地进行数据判断。
let myNum = 0
if (myNum) {...} // 编译器报错
if (myNum == 0) {...} //正确的写法
3-字符型
字符型Character
变量可以存储一个字符,但是一般情况下我们都不会使用这种数据类型,在swift中如果我们定义某个变量时为它赋值为单个字符,编译器也会将其推断为String
类型。同时,为了更好地理解这样的情况,我们也可以大致地将String
类型看做为Character
的集合。例如,我们可以遍历String
中的每个字符:
let myLable = "O" // myLable的类型为String
let myChar: Character = "C" // 显示定义myChar的类型为Character类型
// 遍历打印String中的字符
let myStr = "Hello world!"
for i in myStr {
print(i)
}
4-字符串
除了数据类型,字符串String
类型可以说是我们平时接触最多的一种数据类型。我们常常使用字符串类型数据来存储诸如用户名、用户密码、用户电话号码等信息。如上文所说,我们可以将字符串看做为『一串字符』。字符串String
类型和我们在上面所介绍的整型、浮点型以及字符型这三种基本数据类型不一样,它是一种复合型数据类型。后面我们要介绍的数据类型也都属于复合型的数据类型,并且它们都是建立在基本数据类型的基础上的。
1.字符串的声明
声明字符串类型的数据很简单,将一段由双引号("")将文字包裹起来即可。或者将双引号包裹着的文字传入String
的构造函数中,但这种方式太繁琐,平时不建议这么做。但是使用String
的构造函数来声明一个空字符串变量会显得更加直观:
let userName = "Tom" // userName中的值为“Tom”
let greeting = String("Hi~") // greeting中的值为"Hi~"
let emptyString = "" // 声明一个空字符串变量
let emptyString2 = String() // 这也是一个空字符串变量,这种方式更加直观
2.字符串的拼接
-
使用运算符进行拼接 swift中可以使用加号
+
来进行两个字符串的拼接,甚至还可以使用数值加等号+=
来进行运算:
let userName = "Tom" // userName中的值为“Tom”
var greeting = String("Hi~") // greeting中的值为"Hi~"
let myWord = greeting + userName // myWord为"Hi~Tom"
greeting += userName // greeting中的值现在为"Hi~Tom"
-
使用反斜线
\
插值 我们在使用字符串的时候,经常需要将一个变量的值添加到某一字符串中间。例如我们在显示欢迎语欢迎你,某某某,现在是北京时间12: 08: 09
的时候,需要根据不同的用户来调整某某某
具体的名字,这时候就需要进行字符串的插值。我们可以使用加号+
来把用户名添加到句子中,但这种方法显得很笨重,并不优雅。我们还可以使用反斜线加圆括号\()
的方式来进行插值,变量或者常量的名称卸载圆括号里面,编译器会自动将其解析为正确的语句:
let userName = "Tom"
let result = "欢迎你," + userName + ",现在是北京时间12: 08: 09" //第一种方式,笨重而不够优雅
let result2 = "欢迎你,\(userName),现在是北京时间12: 08: 09" //第二种方式,简单而优雅
-
使用占位符插值 平时我们在输出时间的时候——例如上面的时间,我们通常需要在只有一位数字的时候进行补零,例如上面代码中的
12: 08: 09
,否则12: 8: 9
看起来就很奇怪。在显示小数的时候,有时也会遇到保留几位小数的情况,这时候就需要使用String(format: String, _ arguments: CVarArg..)
构造方法,使用占位符来插值进到字符串中。这种方法与C语言中的数值插值基本相同:
let h = 12, m = 8, s = 9
let timeString = String(format: "北京时间:%02d: %02d: %02d", h, m, s) // 北京时间:12: 08: 09
let cost = 10000.49999
let costString = String(format: "金额为:%.3f", cost) // 金额为:10000.500
5-数组
Swift中,数组使用Array
来表示,它是一系列数据的集合,存储在其中的每个数据都有对应的索引值。可以参考官方提供的图片:
数组
Array
的索引值从0开始,直到总数据数n
减一n-1
位。Swift中的数组Array
、集合Set
以及字典Dictionary
这三种数据结构都采用了泛型来实现,所以它们可以用来存储任意一种数据。但是存储在其中的数据类型一旦被确定,则不能再更改。例如一个数组Array
在定义的时候明确了是用来存储整形Int
数据的,它就不能用来再存储字符串String
或其他数据,反之亦然。为了方便理解,以下直接使用代码来说明数组Array
的初始化、数据的增、删、改,以及遍历数据和其他常用方法等:
// 创建一个空数组,存储数据类型为String
let arr1 = [String]()
// 使用另一种方法创建一个空数组,存储数据类型为Int
let arr2 = Array<Int>()
// 创建一个数组,并存入String类型数据
var arr3 = ["Li Lei", "Han Meimei", "Kate"]
// 创建一个数组,并存入Double类型数据
let arr4: [Double] = [0.1, 0.3, 6.9]
// 向数组最后添加一个数据
arr3.append("Tom")
// 向数组的指定位置插入数据
arr3.insert("Kate", at: 0)
// 删除数组中指定位置的数据
arr3.remove(at: 3)
// 根据下标修改数据指定位置的数据
arr3[0] = "Ann"
// 使用for-in的方式遍历数组
for e in arr3 {
print(e)
}
// 使用下标的方式遍历数组
for i in 0..<arr3.count {
print(arr3[i])
}
// 使用enumerated()方法遍历数组,获得每个数据的索引值以及数据值
for (index, value) in arr3.enumerated() {
print("\(index): \(value)")
}
// 反序遍历数组
for e in arr3.reversed() {
print(e)
}
// 使用enumerated()方法反序遍历数组,获得每个数据的索引值以及数据值
for (index, value) in arr3.enumerated().reversed() {
print("\(index): \(value)")
}
// 获取数组的长度
let lengthOfArray = arr3.count
// 判断数组是否为空
let result = arr3.isEmpty
// 将数组中的值清空
arr3.removeAll()