在使用Flutter开发App的过程中,发现原生开发是绕不过去的。最初选择Flutter的一个很大的理由是, 一套代码,多端运行,降低人力成本,也降低学习成本。现在看来,还是需要学习一些IOS和安卓的原生开发技术。其中IOS的原生开发可以学习swift,本期的主要内容, 就是从一个python和C++开发者角度,窥探swift基本语法。
通过搜索引擎查找一些swift的学习资源,先看一看苹果官方对swift的一些介绍。官方对swift的吹嘘也算是常见操作,大家见怪不怪。由于swift是oc的替代品,从逻辑上来说,应该比oc还是要好一些。
我看菜鸟学院的教程所列出的基本语法还是比较详细的, 就照着这个教程学习一遍swift的基本语法和特点, 顺便看看有没有什么槽点。
0. 开始
跟学习任何一门编程语言一样,我们首先应该在控制台打印出一个字符串。原本应该是Hello World,这里就直接使用Xcode playground默认生成的字符串了。在控制台中查看到符合预期的输出结果,这就是学习swift的开始。
1. 基本语法
在开始之后,我们需要简单熟悉一下swift的基本语法。这一步,暂时还不需要了解太过详细的内容, 仅仅是熟悉基本的一些东西,比如语句、注释、报错、打印等等。总结起来就是:
-
变量使用var定义,常量使用let定义 -
注释与C家族是一样 -
语句的结尾不需要分号 -
操作符前后的空格是一个容易出错的点 -
具备变量类型自动推导的功能,因此可以不指定变量类型名
2. 数据类型
大体了解语法轮廓之后,就需要深入了解这门语言的细节了,第一个重要的细节就是数据类型。常用的基本数据类型无非就是数值类型、bool类型、字符串类型等等。其中数值类型比较复杂一些,又可以分为整型和浮点型,各自又有几种不同范围和精度的子类型。总体看下来,与C++基本一致,只是swift类型的首字母都是大写的,无非是编码规范的差别而已。
3. 运算符
掌握基本数据类型之后,我们来了解一下运算符相关的语法,有了数据总得可以计算才会灵活起来。四则运算、求余运算、比较运算、逻辑与或非这些都跟C++是一样的,也不需要特别的记忆。一个比较特别的地方在于,swift引入了区间的运算符。给定区间的两端,就可以创建一个区间,一个重要的作用是可以在循环中使用。
4. 基本语句
在编程语言中,除了单个的表达式,都会有一些流程控制的基本语句,比如分支和循环。正是这些语句让程序能够实现各种各样复杂的逻辑。if else 分支语句和while循环语句与C++基本一样。swift选择使用for in结构实现for循环,这种循环可能比while循环要常用得多。continue和break的用法与c++和python都是一样的。switch分支语句与C++有些不同,swift默认执行一个case之后跳出, 如果不用跳出需要使用fallthrough关键字。
到这里,swift最基本的部分就已经了解了。大部分都跟C++一样,不一样的地方需要特别记忆一下。再复杂的程序也都是由这些最基本的数据类型和语句组合而成。
5. 常用容器
为了方便,通用编程语言一般都会提供容器数据类型,比如数组和词典类型。数组就是存放一系列相同类型的数据,词典就是存放key-value型的键值对。这两个容器类型大概会是每一个开发者都经常使用的类型, 自然,与之相关的基本操作和循环遍历都是需要掌握的。与C++相比,在概念上没什么太大区别,但是在定义和操作方式上差别比较大,这就得靠死记硬背了。
6. 函数
函数就是一个可以复用的代码块儿,只要定义好输入和输出,内部的实现也就是基本的数据类型和语句的组合。swift对于函数参数的处理比较复杂,每个参数都有对内的名字和对外的名字,当然也可以把两者设置成一样的。而且,在默认情况下,调用函数时必须按指定参数名进行传参。这样的好处是,更改函数参数列表之后,调用处不会错乱;不好的地方就是非常麻烦。可以将外部参数名设置为下划线,就跟C++里面的调用一样了。
除了具名函数,还有匿名函数,通常是用闭包来实现的,可以把闭包简单理解为一对花括号包裹的功能代码块儿。匿名函数也是需要指定参数列表的,swift在这里的语法就让人不得不吐槽, 居然把闭包的第一行用作参数列表,然后在in关键字之后编写函数体,习惯其他语言的开发者在这里会比较别扭。
7. 复合类型
为了更好地组织数据,通用编程语言基本都会提供复合数据类型,开发者就可以定义自己的复合数据,通常称为结构体。在swift中,结构体可以有属性成员和方法成员。只是需要记住一点,结构体之间的拷贝是值拷贝,即深拷贝,也就是对拷贝前后数据的修改不会影响其他数据。这样做的缺点就是运行效率较低。可以记下这个特点,待会儿与class定义的类对比一下。
8. 面向对象
swift号称是一门面向对象的编程语言,自然也就要提供面向对象的几个典型特点,比如封装、继承和多态等等。swift使用class关键字定义类,类可以具有属性和方法,包括自动执行的方法和可调用方法。构造函数采用关键字init,析构函数采用deinit,当前对象使用self表示,至于各自的语法,就只能依靠记忆了。
类构造的对象之间的赋值是引用传递,即浅拷贝, 也就是说,修改任何一个备份都会影响其他使用该对象的备份。这是与struct结构体的一个区别。
类是可以继承的,也就可以让子类复用父类的代码,这也是与struct结构体的一个区别。
作为面向对象,也是可以实现多态的。使用父类引用指向子类对象, 在子类定义中使用override修饰与父类同名的函数,然后使用该父类引用就可以调用子类的函数。
9. 语言特性
swift的语言特性还是比较多的,我们选择其中三种典型的特性看看,其他的在以后开发中遇到再慢慢了解。第一个就是由extension关键字定义的扩展。这项特性可以在不修改原先代码的基础上,为旧的类型添加新的属性和功能。这是近年来很多高级语言都会提供的一个特性,好处就是可以非侵入地扩展旧代码的功能;坏处是最终类型的定义分散在多处,可读性较差。
第二个就是由protocol关键字定义的协议。在其他语言中也称为接口,或者抽象类。这是一种只定义属性和方法的参数列表,而不定义方法体的一种类型。用处就与这个名字一样,为各种实现提供统一的协议,实现方必须编写协议中的每个方法体。注意在定义协议时,需要制定属性的get和set方法。
第三个就是由一对尖括号定义的范型。所谓范型就是指,编写的时候不指定具体类型,只使用通用的别名代替,在调用时才确认实际类型。这样的好处是,可以编写一块满足指定要求的数据类型都可以使用的代码块儿。比如,范型加法就既可以用在整型数据上,也可以用在浮点型数据上。甚至,如果给任意的类型提供“可加”性质时,都可以复用这段代码。
结尾
总体来看swift语言,提供的语法还是很全的,有C++的影子,也有Python的影子,当然也借鉴了不少其他高级语言。这样做的好处可能是让各种常用语言的开发者都能有一种熟悉感,但就会显得语法比较乱。各种细碎的语法糖虽然能提供一些编码上的便利,但是需要去记忆的语法点就比较多。这次窥探swift还是挑选主要的语法来尝试,至于那些旁枝上的语法点确实不少。无论如何,swift相比于oc总是一个非常不错的进步,至少没有oc那满篇的中括号。由于我只在flutter中使用swift,因此并不需要非常熟悉,只需要了解基本语法,能修修改改即可。如果专业使用swift开发苹果应用的开发者,那恐怕还得花不少时间练习。
发表评论