前言
为什么要学习Swift?(个人观点)
- Swift是苹果公司推出的语言,目的是为了取代Objective-C,未来苹果公司一定会加大Swift的推广和发展。
- Swift5.x的ABI已经稳定,这就意味着Swift不会发生巨大的改变,即使再更新一些版本,也不会出现项目大面积的报错,一些函数无法使用的情况了。
- iOS作为大前端的一份子,整个大前端的趋势偏向了声明式的编程,比如Vue、React、Flutter、微信小程序等,而且苹果也在iOS13出现的时候,发布了SwiftUI这种声明式编程的方式。而SwiftUI的使用基于掌握Swift语言的。
综上,现阶段作为一个iOS开发者,掌握Swift语言已经是必备的了。
学习Swift最权威的地址就是他的官方文档。
Swift是开源的,我们可以从GitHub上获取Swift源码
废话不多说,我们一起来学习和探索Swift吧。
基础语法
来到了Swift的世界,我们首先是和这个世界打个招呼。Hello World! 是学习一门语言的必经之路!
print("Hello World!") // Hello World!
在Swift中,一般情况下,一句代码的结尾是可以省略分号(;)的。什么时候需要加分号呢?当两句代码写在同一行的时候,需要用分号隔开。
1.1 常量和变量
- 使用
let
关键字声明一个常量,常量一旦声明成功,是不能再修改的,只能被赋值1次。如果尝试修改常量的值,在编译时就会报错 - 常量的值不要求在编译时期确定,也就是说它可以接收一个函数的返回值(这里的函数了解一下即可,后面会详细说)。
// 声明一个常量
let num = 10
num = 20 // 报错 Cannot assign to value: 'num' is a 'let' constant
---------------------------------------------------------------------------------------------
func getNum() -> Int {
return 30
}
// 接收一个函数的返回值
let num = getNum()
- 如果想要值可以被修改,就要使用变量,关键字为
var
// 声明一个变量
var num2 = 20
num2 = 40
print(num2) // 40
以上我们定义了一个常量,一个变量,而我们却没有指定他们的类型。这是因为Swift的编译器会自动进行类型的推导,以上2个例子编译器会将他们自动推导为Int类型。我们是可以查看他们的类型的,这里介绍一种方式,按住option键(会出现一个问号,点击变量/常量就可以看到他的具体类型了。
- 常量/变量在使用之前一定要被初始化,否则编译器会报错,不像Objective-C编译器会有一个默认值。
- 如果只写了前2句代码,编译器是不会报错的,仅仅是指定了他们的类型,一旦想要获取他们的值,编译器就会报错,因为他们根本就没有默认值
let a:Int
var b:Int
print(a) // Constant 'a' used before being initialized
print(b) // Variable 'b' used before being initialized
- 常量/变量没有指定类型,编译器报错。编译器都不知道他是什么类型的,所以直接报错了
let c // Type annotation missing in pattern
1.2 整型和浮点类型
Swift中定义了许多整数类型:Int8
、Int16
、Int32
、Int64
、UInt8
、UInt16
、UInt32
、UInt64
。后面的数值代表的是位数。
而我们最 常用的是Int
类型,在不同的平台下,Int
类型代表不同的位数,32位平台Int
相当于Int32
,而64位平台Int
相当于Int64
。
浮点类型有2个:Float
和Double
Float
:32位精度只有6位。
Double
:64位精度至少15位。
如果不明确指定类型,编译器默认推导为Double
类型。
let value = 10.0 // Double 类型
1.3 字符串插值
- Swift中有自己的方式进行字符串的插值,在需要拼接的字符串中,使用
\(变量/常量/表达式)
的方式进行字符串插值
let name = "YaoMing"
let age = 39
print("My name is \(name) and My age is \(age + 1)")
// My name is YaoMing and My age is 40
1.4 元组类型
Swift中大部分类型其他语言中都有,但是元组类型是很多语言中没有的。
元组可以将多个值分组成为一个复合值,元组中的值可以是不同类型的。下面的例子中,用元组来表示网络请求一些状态
当我们需要返回多个值的时候,就可以使用元组类型
- 通过索引获取元组中对应的值(可读性一般)
let http404Error = (404, "Not Found")
print("The status code is \(http404Error.0)")
print("The status message is \(http404Error.1)")
- 通过变量/常量 分解元组的内容(可读性比较好)
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
print("The status message is \(statusMessage)")
- 通过使用下划线,忽略部分值
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
1.5 类型安全
Swift是类型安全的语言,不同类型的数据是不能相互进行传值和计算的。
let x: Int = 20
let y: Double = 3.13
let result = x + y // 报错 Binary operator '+' cannot be applied to operands of type 'Int' and 'Double'
let result1 = x + Int(y)
let result2 = Double(x) + y
print(result1)
print(result2)
网友评论