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


    在这里插入图片描述

    雨燕捎帘入,风花拥槛浮

    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 语言的小伙伴们,可以移步如下链接观赏更多内容:

    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];
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    虽然从某些方面来看,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 在性能上对比的系列博文:

    大家可以看到,在通用代码中 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    如上图所示,短短十几行代码(除去 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 代码并动态地执行它们以进行快速测试和调试。 ↩︎

  • 相关阅读:
    当年很流行,现在已经淘汰的前端技术有哪些?
    K8s: 在Pod中将configmap数据注入容器
    探索Web前端三大主流框架:React,Angular和Vue.js
    postgresql使用pg_basebackup备份与恢复
    C++Qt开发——类图结构
    LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
    vb.net的日期工具类
    有关供应链大赛的一些习得的经验和感受
    十一、面向对象 其他要点
    K8S-CNI
  • 原文地址:https://blog.csdn.net/mydo/article/details/133784727