『第二章』这只燕子很特别:Swift 特性

news2024/11/18 14:05:27

在这里插入图片描述

在本篇博文中,您将学到如下内容:

  • 1. Swift 语言概览
  • 2. Objective-C “练废了”,重新写一门新语言吧!
  • 3. Swift 的“习性”与优势
    • 3.1. Swift 更简洁、更易于阅读、所需代码更少
    • 3.2. Swift 更加安全
    • 3.3. Swift 内存管理更加统一
    • 3.4. Swift 更快
    • 3.5. Swift 会有更少的命名冲突
    • 3.6. Swift 的 Playground 和 Preview 更易于编写原型代码
    • 3.7. Swift 是一门朝气蓬勃面向未来的语言
  • 4. 一个简单的例子
  • 总结

雨燕捎帘入,风花拥槛浮

The Swift brings in the curtain,
with the wind and flowers float on the threshold

——出自刘子翚《寄张子平》

1. Swift 语言概览

Swift 是一门现代化气息浓重的系统编程语言,它语法简洁、人性化、注重安全性。它从 C、C++、Objective-C、Ruby、C# 等高级语言中借鉴了诸多优点,厚积薄发。

Swift 对于初学者来说很友好, 它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味性的编程语言。

它支持代码和界面预览,这个革命性特性允许程序员在不编译和运行应用的前提下运行 Swift 代码并实时查看结果。

感受一下苹果 Swift 的宣传语:

Swift 是一种强劲而直观的编程语言,它由 Apple 创造,可用来为 iOS、Mac、Apple TV 和 Apple Watch 开发 app。 它旨在为开发者提供充分的自由。 Swift 易用并且开源,只要有想法,谁都可以创造非凡。

想通过  官网了解 Swift 语言的小伙伴们,可以移步如下链接观赏更多内容:

  •  Swift 一种强大且易学的编程语言

2. Objective-C “练废了”,重新写一门新语言吧!

为了知己知彼更好的与小雨燕“共舞”,我们有必要更深的了解一下它的“前任”:Objective-C(以下简称Objc)语言。

在这里插入图片描述

Objective-C 又称 Objc 或 OC 语言,它是对 C 语言面向对象功能的扩充,不同于 C++,Objective-C 对于 C 的扩充是属于轻量级的,这使得 Objc 语言本身要比 C++ 简单的多。

很多人觉得 Objc 语法十分怪异,这是因为它传承于 Smalltalk 语言的缘故:

#import <Foundation/Foundation.h>
 
// 类Box的接口定义
@interface Box:NSObject{
	int l;
	int w;
}

@property int l,w;
-(void)print;
@end
 
// 类Box的实现
@implementation Box
@synthesize l,w;
 
-(void)print{
	NSLog(@"l=%d,w=%d",l,w);
}
@end

// 创建Box实例对象
Box *box = [[Box alloc] init];
// 调用Box实例方法
[box print];

虽然从某些方面来看,Objc 很像 C 语言,但骨子里 ObjC 却是一个完全动态的语言,其内部对方法的调用统统采用发送消息的机制,这使得 Objc 灵活度爆棚。

在这里插入图片描述

GCC 与 Clang 都含有 Objc 编译器,Objc 可以在 GCC 以及 Clang 运行的系统上编译。除此之外,Objc 还包含一个非常简单的垃圾回收系统:ARC。

Objc 的流行归功于 iPhone 的成功,或者反过来说也没错。因为在当时编写 iPhone 应用程序的主要编程语言就是 Objc。

其实 Objc 也是一门非常优秀的语言,不过它毕竟“年纪”有点大,无论是语言简洁性或是对新特性的支持上来说,都有些落伍。比如说它“蹩脚”的语法、Runtime 的各种黑魔法以及不支持命名空间等诸多瑕疵。

Objective-C 语言从诞生到现在几十年一共才迭代 2 个大版本,而 Swift 短短几年就已经有 5 个大版本了,小版本更是不计其数。

后来,已成为 Swift 语言之父、LLVM 之父以及 clang 神一般男人的克里斯·拉特纳曾被问及这样一个问题:

为什么要开发Swift语言,而不是把精力花在优化 Objective-C 上?

在这里插入图片描述

他是这样回答的,原因有三个:

  1. 如果大幅度优化 Objc ,把很多 Swift 中的特性也添加进去,这对开发者来说是灾难性的,因为他们要对原来的 App 进行大幅度修改;
  2. Objc 在很多问题上积重难返,比如安全上的问题;
  3. Objc 是基于 C 开发的语言,所以无论怎么优化,它也必然含有 C 语言自身的缺陷。

在这里插入图片描述

做一件事情最好是在十年前,其次是现在!

如果说十年前做 Apple 开发当仁不让的选择是 Objc 的话,那么现在 Swift 语言就是一个非常明智的选择了。

3. Swift 的“习性”与优势

简单来说,Swift 语言有如下特点和优势:

3.1. Swift 更简洁、更易于阅读、所需代码更少

正如你所能预计到在一门基于 C 构建的语言上,Objective-C 所有的弊端都存在。

而 Swift 丢弃了遗留下来的约定,因而我们不再需要行尾的分号,以及 if/else 语句中围绕条件表达式的括弧。Swift 中方法调用不再出现互相嵌套方括号的深坑 (再见吧,[[[ ]]]),调用更像是自然英语一样丝般顺滑。

一个非常明显的结果是:对于同样功能的代码,Swift 需要的代码行数远远少于Objc。代码越少,出错可能性自然越低,这是铁一般的真理。

3.2. Swift 更加安全

不像 Objc,Swift是一门类型安全的语言,这意味着 Swift 会杜绝代码中类型不一致情况的出现。

因为 Objc 相对更加底层,所以对诸如指针之类对象的使用更需小心翼翼。而 Swift 从语言层面就帮我们避免了在托管情况下访问底层内容(当然非托管下还是可以的),极力防止了“低级错误”的发生。对于Objc 中棘手“空”值的处理,Swift 提出可选值的概念,完美避开了风险,进一步增加了语言的安全性。

3.3. Swift 内存管理更加统一

Swift 以一种 Objective-C 前所未有的方式对内存管理进行了统一,对自动引用计数 (ARC) 的支持是在整个过程化和面向对象代码路径上完成的。

在Objc 中使用 Core Graphics API 以及其它 iOS 上底层的 API 时,内存管控处理都是码农们的责任;而 Swift 将这些调用进行了安全封装,码农们在 Objective-C 上会遇到大量内存溢出的问题在 Swift 上几乎是不可能出现的。

3.4. Swift 更快

苹果公司从一开始就力图将 Swift 打造成一门极具效率、迅捷的语言,Objc 和 Swift 语言在 Richards 上评测的结果显示:Swift 比 Objc 快了4倍,要知道 Objc 可是彻头彻尾的动态分发语言。

而且删除遗留下来的 C 语言约定也大大提升了 Swift 引擎的性能。苹果公司一直都在致力于 Swift 代码运行速度的提升。

毋庸置疑,Swift 同 Objc 相比会更快!


有兴趣的小伙伴们可以观赏我写的关于 ARM64汇编、C、ruby 和 Swift 在性能上对比的系列博文:

  • 有趣的小实验:四种语言搞定“超超超难”剑桥面试数学题
  • 搞定“超超超难”剑桥面试数学题番外篇:ARM64汇编
  • 搞定剑桥面试数学题番外篇2:使用多线程并发“加强版”
  • 超详细:ARM64 汇编实现 C 标准库中的 memset() 函数

大家可以看到,在通用代码中 Swift 语言的效率甚至不输于 C 和汇编语言,可谓相当惊人。


3.5. Swift 会有更少的命名冲突

Objective-C 代码中一直令人困扰的问题是缺乏对命名空间的正式支持, 它是 C++ 等其它高级语言处理名称冲突的解决方案。当名称冲突发生在 Objc 中时,将是一个链接器错误,这会导致 app 无法运行。

而 Swift 语言提供了隐含的命名空间,允许相同代码文件存在于多个项目中,这样不会造成构建失败,也不需要像 NSString(源自NextStep系统1)或者 CGPoint(Core Graphics)这样的古怪名称。

Swift 这一特性使得开发者更加具有生产力,在 Array,Dictionary 以及 String 这样简洁的名字中大家可以领略 Swift 简洁魅力之所在:它们让 Objc 中 NSArray、NSDictionary 和 NSString 这样冗余的名字情何以堪。

3.6. Swift 的 Playground 和 Preview 更易于编写原型代码

作为快速编写原型和测试来说,没有比 Swift 中 Playground 更给力的了,这在 Objective-C 中几乎是束手无策的事。

在这里插入图片描述

类似于 Ruby 中的 irb 2环境,Playground 就像一个设备齐全的实验室,任你在其中做任何快速和“危险”的实验,无论是代码原型、性能、数据库或是界面布局的测试都没有任何问题,而且这在 iPad 中也被很好的支持。

在 Xcode 中,我们可以使用预览(Preview)来实现复杂界面 “更改-预览-完善” 这一敏捷闭环。

在这里插入图片描述

我们会在 第三章第十章 中详细介绍 Playground 和 Xcode 中的预览。

3.7. Swift 是一门朝气蓬勃面向未来的语言

从 Apple 公司的行动和策略中可以看出,Swift 是其力捧的一门语言,虽然说Objc 在未来长时间内都将持续存在,但 Swift 无疑会成为开发中更优秀的中流砥柱。

苹果诸多新特性将只支持 Swift,新组件也只能用 Swift 编写。苹果自己用 Swift 语言(包括 SwiftUI)构建的官方 App 数量已占压倒性优势。

随着 Swift 6.0 的降临,小雨燕将变得更加生龙活虎,让我们计日以俟吧!😉

4. 一个简单的例子

所有伟大编程语言的入门总是从最简单的示例开始,学习 Swift 也不例外。

下面就让我们在 Playground 中用 Swift 新的 SwiftUI 框架来展示那句经典的 Hello 语句吧:

import SwiftUI
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

let v = VStack {
    Text("Hello Swift")
        .font(.largeTitle)
        .foregroundColor(.red)
        .padding()
        .background(RoundedRectangle(cornerRadius: 10).fill(Color.blue))
}

PlaygroundPage.current.liveView = UIHostingController(rootView: v)

在这里插入图片描述

如上图所示,短短十几行代码(除去 Playground 自身配置代码,只有几行),我们活灵活现的在屏幕上展现了一个颜色鲜明的视图,其中鲜红的文本“Hello Swift” 正是我们所期待的。

上面寥寥几行 Swift 语言的代码给我们直观感觉是:简洁、优雅、组织精良、缩进得当。

上面的代码大家现在可能有些“丈二和尚摸不着头脑”,没关系,这正是我们这一专栏将要做的事情:让小伙伴们对 Swift 了然于胸!相信当大家看完本专栏的博文后,可以完全掌握并且熟练运用 Swift 语言。

总结

在本篇博文中,我们从 Swift 前任 Objc 开始介绍,如数家珍的列出了 Swift 诸多特点和优势,最后我们用了一小段简洁的代码片段让小伙伴们初步领略到 Swift 之美。

现在,无论是从语言规范上还是社区建设来看,Swift 越发的趋于成熟和稳健,相信今后在苹果平台乃至其它第三方平台上 Swift 语言将会是当仁不让的“超级巨星”。

各位小伙伴们看到这里肯定都迫不及待准备撸码了吧?但先别急,在接下来的文章中,我们先来聊聊让 Swift 舒适撸码的各种环境和准备工作,稍后见!😉


  1. 2.NEXTSTEP 是由 NeXT.Inc 所开发的操作系统。NeXT也是上任苹果CEO,Steve Jobs 在 1985 年离开苹果电脑公司后所创立的公司。 ↩︎

  2. 1.irb 代表Interactive Ruby,它是 Ruby 解释器的一个交互式组件,用于编写 Ruby 代码并动态地执行它们以进行快速测试和调试。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis主从模式(二)---拓扑结构及复制过程

目录 一, Redis主从模式下的复制拓扑结构 1.1 一主一从结构 1.2 一主多从结构 1.3 树形主从结构 二, 主从复制过程 2.1 主从复制建立复制流程图 2.2 数据同步(psyc) 1.replicationid/replid (复制id) 2.offset(偏移量) 2.3 psync运行流程 2.4 全量复制 2.5 部分复制…

Opencv-图像插值与LUT查找表

图像像素的比较 白色是255&#xff0c;黑色是0 min(InputArray src1,InputArray src2,OutputArray dst) max(InputArray src1,InputArray src2,OutpurArray dstsrc1:第一个图像矩阵&#xff0c;通道数任意src2&#xff1a;第二个图像矩阵&#xff0c;尺寸和通道数以及数据类型…

【C++面向对象】5. this指针

文章目录 【 1. 基本原理 】【 2. 实例 】 【 1. 基本原理 】 在 C 中&#xff0c;只有成员函数才有 this 指针&#xff08;友元函数没有 this 指针&#xff0c;因为友元不是类的成员&#xff09;&#xff0c;this 指针是所有成员函数的隐含参数。 在成员函数内部&#xff0c;…

用*画田字形状,numpy和字符串格式化都可以胜任

numpy的字符型元素矩阵&#xff0c;可以方便画&#xff1b;直接python字符串手撕&#xff0c;也可以轻巧完成。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《…

【WinForm详细教程一】WinForm中的窗体、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox

文章目录 1.WinForm文件结构2. 窗体的常用属性、方法与事件2.1 常用属性&#xff08;可直接在属性中设置&#xff09;2.2 常用方法2.3 常用事件 3.Label、TextBox及Button控件4.RadioButton和CheckBox5.ListBox&#xff08;列表框&#xff09; 1.WinForm文件结构 .sln文件 &am…

IEEE754 标准存储浮点数

1. IEEE754 标准简介 IEEE754 标准是一种用于浮点数表示和运算的标准&#xff0c;由国际电工委员会&#xff08;IEEE&#xff09;制定。它定义了浮点数的编码格式、舍入规则以及基本的算术运算规则&#xff0c;旨在提供一种可移植性和一致性的方式来表示和处理浮点数 IEEE754 …

浅谈电力电容器的故障处理及选型

安科瑞 华楠 【摘要】常见的电力电容器都是为了改善电力系统的电压质量和提高输电线路的输电能力&#xff0c;它们在减少系统功率损耗、提高功率因数、降低运行电流、提升电网电压、释放变压器使用裕度等方面有着显著效果。按电压等级可以划分高、低压两部分。虽然它们可以起着…

Vue mixin混入

可以把多个组件中共有的配置提取出来构成一个混入。 一、配置混入 &#xff08;一&#xff09; 创建mixin.js 这里的名字可以自定义&#xff0c;但是为了方便识别&#xff0c;多数场景下都写mixin。 mixin.js 要创建在src目录下&#xff0c;与main.js平级&#xff1a; &…

win10启动venv报错:无法加载文件 venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。

背景&#xff1a; 最近需要用到python开发&#xff0c;切换虚拟环境时&#xff0c;在win10系统上安装编辑器后创建了虚拟环境&#xff0c;但是执行activate时报错&#xff1a;.\venv\Scripts\activate&#xff0c;报错内容如题&#xff1a; 无法加载文件 venv\Scripts\activa…

HTTPSConnectionPool(host=‘huggingface.co‘, port=443)解决

huggingface&#xff0c;也就是抱抱脸&#xff0c;应该都很熟悉了吧 好用是很好用&#xff0c;就是有一个问题&#xff0c;国内的IP地址总是不灵是吧 今天我就碰到这么个问题 请看图&#xff1a; 。。。。图找不到了&#xff0c;我的问题忘记记录了 我给你们贴上文字吧 (M…

reactNative导入excel文件

组件内导入 import {TouchableOpacity,PermissionsAndroid} from react-native; import RNFS from react-native-fs; import XLSX from xlsx; import DocumentPicker from react-native-document-picker; import {Buffer} from buffer;// 需要安装一下三个,Buffer和react-nati…

Standford Compiler Course Assignment 2

第二部分的作业是语法分析&#xff0c;通过编写cool.y(这个assignment的任务)&#xff0c;利用bison将其自动生成语法分析LALR(1)的代码。 语法分析&#xff0c;就是将词法分析阶段已经识别好的token&#xff0c;按照语法的规则&#xff0c;构建抽象语法树的过程。 比如以下的…

读书笔记之《敏捷测试从零开始》(一)

大家好&#xff0c;我是rainbowzhou。 子曰&#xff1a;学而时习之&#xff0c;不亦说乎&#xff1f;今天我想和大家分享一本测试书籍——《敏捷测试从零开始》。以下为我的读书笔记&#xff1a; 精彩片段摘录&#xff1a; 焦虑往往来自于对比&#xff0c;当你在自己的圈子里面…

Elasticsearch之mapping

文章目录 以显式的方式创建一个映射查看某个具体索引的mapping定义向已存在的映射中添加一个新的属性查看映射中指定字段的定义信息更新已存在映射的某个字段 1、 官方文档地址 2、 字段类型 1、定义&#xff1a;映射是定义文档及其包含的字段如何存储和索引的过程。 2、每个…

LabVIEW在 XY Graph中选择一组点

LabVIEW在 XY Graph中选择一组点 问题&#xff1a;有一个包含许多点的XY Graph&#xff0c;在程序开发中&#xff0c;对于显示XY Graph中的多个点&#xff0c;如何进行选取。最好能像图像处理中的ROI一样&#xff0c;并且它们的颜色可以更改&#xff0c;可以在其中选择一些ROI…

企业安全—SDL概述篇

0x00 前言 众所周知&#xff0c;从源头开始就开发安全的代码&#xff0c;比产品已经成型之后付出的代价要小很多&#xff0c;也就是一直在说的安全左移的概念。最好就是从一开始&#xff0c;大家就用最安全的代码&#xff0c;或者是框架&#xff0c;那么开发出来的产品必然会减…

C++ string 类的其他操作

4.3.2 string 类的其他操作 在C新增string类之前,程序员也需要完成诸如给字符串赋值等工作。对于C语言式的字符串,程 序员使用C语言库中的函数来完成这些任务。头文件cstring(以前为string.h)提供了这些函数。例如,可 以使用函数 strcpy()将字符串复制到字符数组中,使用函数…

小样本学习(2)--LibFewShot使用

目录 一、LibFewShot安装 1、LibFewShot代码仓库 2、配置环境 3、测试安装是否正确 二、LibFewShot结构 1、config文件夹 2、core文件夹 3、reproduce文件夹 4、results文件夹 三、如何训练自己的数据集 1、调用主配置文件 2、修改主配置文件 一、LibFewShot安装…

实时流量监控

任何企业的IT管理员的主要目标都是交付一个高度稳定的网络&#xff0c;没有任何压力或重大故障&#xff0c;但是考虑到动态在今天的技术和网络中&#xff0c;这可能需要付出巨大的努力来获得可见性并避免负面影响。 交付高响应的网络和应用程序意味着保持网络正常运行&#xf…

C#开发的OpenRA游戏之金钱系统(5)

C#开发的OpenRA游戏之金钱系统(5) 前面分析了采矿车到矿场采矿的过程,那么采矿车什么时候采满呢?采满之后又是怎么样运送到精炼工厂呢? 首先我们来分析采矿车是怎么样判断采满矿产的,毕竟采矿车不能无限装载矿产资源。所以我们再次回到采矿车类Harvester,来分析它怎么…