有 OC 经验的程序员快速学习 Swift 语法

Posted VeggieOrz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有 OC 经验的程序员快速学习 Swift 语法相关的知识,希望对你有一定的参考价值。

前言

苹果官方推出 Swift 语言至今,已经过了 7 年之久,Swift 也更新到了 5.5 版本, 它的语法和 API 也趋向于稳定。最近闲来无事,决定开始研究这 ios 开发编程语言的语法。因为之前有多门编程语言的使用经验,所以本文主要记录一些个人认为比较新奇的 Swift 语法

中文版 Swift 文档:https://swift.bootcss.com/
Swift 语言开源链接:https://github.com/apple/swift
MJ 的 Swift 教学视频:https://www.bilibili.com/video/BV1uZ4y1T7G5

Swift PlayGround

所谓 “工欲善其事,必先利其器”。要想更好地学习 Swift 的语法,我们也需要合理使用开发工具 Xcode,通往们是通过 PlayGround 来进行 Swift 的语法练习。

我们可以通过 File -> New -> PlayGround(如下图所示),新建一个 PlayGround。

接着选择 Black -> Next,完成 PlayGround 的创建。

为了方便划分我们的单元练习,PlayGround 还支持多 Page 功能,每个 PlayGround Page 可以保存一份练习的 Swift 代码。我们可以通过下面两种方法新建 PlayGround Pag。

方法一:点击 File -> New -> PlayGround Page

方法二:双击 PlayGround 名称,选择 New PlayGround Page。

Swift 语法

可选类型与nil

在 OC 中,nil 只能赋值给 OC 对象,表示一个不指向任何对象的指针。而在 Swift 中,nil 意义有所不同,它表示值缺失(即没有值)的情况,可以用于任意类型的值缺失(包括基本类型、枚举、结构体和对象等)。

可选类型表示的是该类型的变量的值有可能出现缺失的情况,在类型后面加上 ? 就可以表示可选类型。如下所示:

// 可选类型,没赋值默认为 nil
var num: Int?

swift 是强类型语言,我们通常不能直接把可选类型直接赋值给基本类型,当我们确定可选类型变量一定包含值之后,可以在后面添加 ! 来取值。

var num: Int? = 1024
// 对可选类型进行强解析(要确保它有值)
var specialNum: Int = num!

忽略参数标签

我们在声明函数的时候,需要把写明参数名。然后与之相对地,在调用函数的时候也需要写上参数名,如下面代码所示:

func sayHello(name: String) {
	print("Hello, \\(name)~")
}

// 在调用的时候,需要把参数名 name: 带上
sayHello(name: "Veggie")

有时候,我们会觉得这样带参数名的函数调用方式比较麻烦,希望可以在调用的时候忽略它。这时,我们可以用忽略参数标签 _ 来简化它,用法如下面代码所示。

// 在参数标签前面加上 _	
func sayHello(_ name: String) {
	print("Hello, \\(name)~")
}

// 函数调用时可以不需要
sayHello("Veggie")

可变参数

Swift 像其他高级语言一样,它的函数也支持可变参数的输入。一个可变参数可以接收零个或多个参数,可以使用在参数个数不确定的场景,我们通过在参数后面添加 ... 来定义可变参数。需要注意的是,一个函数只能有一个可变参数。使用例子如下所示:

func arithmeticMean(_ numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}

// 输出 3.0, 是这 5 个数的平均数。
print(arithmeticMean(1, 2, 3, 4, 5))

// 输出 10.0, 是这 3 个数的平均数。
print(arithmeticMean(3, 8.25, 18.75))

可以看到可变参数在传入函数后会变成对应类型的数组,因此我们在大多是场景中可以直接使用数组代替。

inout 关键字

进行函数调用的时候,我们传参默认都是进行值传递,在函数内部改变参数的值,不会引起函数外部变量的改变。当我们希望进行引用传递的时候,可以用上 inout 关键字。在传参的时候,传入的变量需要用 & 修饰,是 C 语言类似。

// 交换 a 和 b 的值
func swapValue(_ v1: inout Int, _ v2: inout Int) {
    let temp = v1
    v1 = v2
    v2 = temp
}

var a: Int = 1, b: Int = 2
// 传入的参数需要加上 &,进行地址传递
swapValue(&a, &b)
// 打印变量交换后的结果
print(a, b)

需要注意的是:

  • 可变的参数不能标记为 inout
  • 标记为 inout 的参数不能带默认值

后记

Swift 语法的快速学习,只是为了帮助我们快速看懂 Swift 项目中的代码,能够窥探其他人的编程思路,并能对现有的代码进行简单的定制化修改。

如果希望能熟练使用 Swift 语言,关键还是要自己多写,可以多利用新学的语法写小 Demo, 或者刷 LeetCode 题目。语法使用得多了,就很容易形成肌肉记忆,所谓的「Practice makes perfect」就是如此吧。


内容在持续更新中……

以上是关于有 OC 经验的程序员快速学习 Swift 语法的主要内容,如果未能解决你的问题,请参考以下文章

[OC学习笔记]objc_msgSend:方法快速查找

从 OC 到 Swift 的快速入门与专业实践

牛B的swift屏幕旋转经验终结者(OC统一思路)

Swift 从OC入门

Swift学习笔记——基础语法

swiftDay01笔记 --swift和OC的不同点 && swift的基础语法