前言

苹果官方推出 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 语法
    • 可选类型与nil
    • 忽略参数标签
    • 可变参数
    • inout 关键字
  • 后记

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 = 0for 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 = v1v1 = v2v2 = temp
}var a: Int = 1, b: Int = 2
// 传入的参数需要加上 &,进行地址传递
swapValue(&a, &b)
// 打印变量交换后的结果
print(a, b)

需要注意的是:

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

后记

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

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

编码实践的另一个好处就是,有助于我们发现自身当前知识的缺陷。比如,我们在写 for 循环的时候,只是看看一下大概的写法,当我们需要去写逆序遍历的时候,我们就会发现所学的 .....< 都是在应付正序的情形,于是我们就会学到 stride 函数。这种对知识点的查漏补缺,可以弥补理论学习中的不足,帮助我们健全知识体系,解决实际问题。


内容在持续更新中……

有 OC 经验的程序员快速学习 Swift 语法相关推荐

  1. 2019年Java程序员的学习路线

    2019年Java程序员的学习路线 一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kot ...

  2. Java程序员应该学习的10件清单

    作为程序员,我们最大的挑战是让自己保持最新状态.技术变化非常快,每隔几年你就会看到一个新版本的编程语言和框架出现. 扫码关注<Java学研大本营>,加入读者群,分享更多精彩 当2021 年 ...

  3. 【给程序员英语学习的一些建议】我是乔治老师,我在这里播报。

    给程序员英语学习的一些建议 - 我是乔治老师,我在这里播报. 从业以来,因为工作的关系,我结识了不少程序员朋友.当然,作为一名英语教学从业者,我们谈论的最多的还是关于英语的学习.但是,从我的这些程序员 ...

  4. 一本开源的程序员快速成长秘笈

    写在前面 前几天和 PPMoney 万惠集团董事长宝叔以及几个合作伙伴一起吃饭,席间宝叔戏言引用一个段子来描述个人成长:读万卷书不如行万里路,行万里路不如阅人无数,阅人无数不如名师指路,名师指路不如自 ...

  5. 【今日荐文】一本开源的程序员快速成长秘笈---康德胜

    写在前面 前几天和 PPMoney 万惠集团董事长宝叔以及几个合作伙伴一起吃饭,席间宝叔戏言引用一个段子来描述个人成长:读万卷书不如行万里路,行万里路不如阅人无数,阅人无数不如名师指路,名师指路不如自 ...

  6. 从阿里社招面试,看“野生”Java程序员的学习道路

    引言 很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做<回答阿里社招面试 ...

  7. C#:程序员快速熟悉C#

    C#:程序员快速熟悉C# 前言 基础篇 变量命名 字符串常量 @"" 可空类型(Nullable) 数组 参数数组 数组的基类 Array 结构体 循环 结构 struct 枚举 ...

  8. 程序员英语学习之英文官网查看Kafka(三)

    程序员英语学习之英文官网查看Kafka(三) 1. 背景 作为程序员,由于计算机软件本身历史原因,最新和最全的资料很多都是外网上的英文资料.部分有中文版,但受限于官网或者爱好者精力,并不会很全面和很新 ...

  9. 2020年Java程序员不得不学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

最新文章

  1. IBM收购Q1 Labs
  2. xampp php源码的路径,php – XAMPP中的根路径
  3. free,ps,抓包,网络状态
  4. python比较文件每行长度_读取文件并查找所有行的长度是否相同
  5. 江西职业教育集团计算机应用竞赛,【喜报】江西工业职院电子与信息工程学院学生在计算机应用竞赛钟喜获佳绩...
  6. 只显示小方格_魔力科学小实验 | 只能剪一刀,如何将图片中的红白方块分开?...
  7. error:Microsoft Visual C++ 14.0 is required.
  8. nginx配置中文域名解析
  9. 毕设题目:Matlab图像边缘检测
  10. 430单片机实现三人投票表决器_基于单片机的五人表决器的设计
  11. C在mac上用不了malloc.h头文件的解决方法
  12. PPC手机新手教程,使用方法,疑难解答,最强大的PPC手机使用手则
  13. 百度地图只显示行政区划轮廓
  14. HBA的WWN号以及存储区域网络
  15. 随感10-Transecndence超验骇客
  16. 浅析计算机用户身份识别技术,(浅析身份认证技术.doc
  17. 计算机word上下左右边距,Word页边距调整设置(上下左右边距,2003-2013)
  18. AddressBook通讯录右边索引条
  19. 点击右键计算机属性弹出任务管理器,win10查看内存条型号的步骤
  20. 酷炫页面产品图片展示

热门文章

  1. Celery组件架构介绍
  2. java 并发 mobi_Java并发编程的艺术pdf txt mobi下载及读书笔记
  3. (50)补充内容:SSDT HOOK 模板
  4. const * 和 * const 的区别
  5. python封装一个效率极高的 批量更新、插入合一的工具
  6. 11、MySQL算术运算符
  7. ACM入门之【二分】
  8. 力扣: 88. 合并两个有序数组
  9. MySQL读写分离应用层解决
  10. Servlet程序自动加载