Swift 简介

Souleigh ✨ 等级 501 0 0

Swift和Objective-C的主要区别

1,编程范式

Swift可以面向协议编程、函数式编程、面向对象编程

Swift语言引入了协议、协议的扩展、泛型等新特性,因此使用Swift语言可以很好地面向协议编程;Swift语言将函数和闭包提升为语言的一等公民,函数可以作为一个变量、可以作为其他函数的参数、作为其他函数的返回值等来传递,所以我们可以使用Swift来进行函数式编程,另外Swift也提供了很多高阶函数来辅助我们进行函数式编程;Swift也提供了属性的权限限定等面向对象的基础设置,因此在Swift中也可以面向对象来编程。

Objective-C以面向对象编程为主,当然你可以引入类似Reactive Cocoa的类库来进行函数式编程,但是这种函数式编程的特性就不是语言本身来提供的了,而是引入第三方类库来实现的。

2,类型安全。

Swift是一门类型安全的语言,鼓励程序员在代码中清楚明确值的类型。如果代码中使用一个字符串String,那么你不能错误地传递一个整型Int给它,因为Swift是类型安全的,它会在代码编译的时候做类型检查,并且把所有不匹配的类型作为一个错误标记出来,这使得程序员在开发中尽可能早得发现和修正错误。

Objective-C则不然,你声明一个NSString变量str,仍然可以传一个NSNumber类型的变量给它,此时尽管编译器会报警告,但是你仍然可以作为一个NSNumber来使用变量str。不过,此时如果你将变量str作为一个NSString来使用的话,那么在运行期间就会Crash。

3,值类型的增强。

在Swift中,结构体、枚举、元组都是值类型。而平时使用的Int、Float、String、Array、Dictionary、Set都是使用结构体来实现的,也是值类型

Objective-C中,NSNumber、NSString,以及集合类(字典、数组、set)都是指针类型

4,枚举类型的增强

Swift中,枚举可以使用整型、浮点型、字符串等来表示其枚举成员的原始值,还能拥有属性和方法,甚至支持泛型、协议、扩展等等。

在Objective-C中,枚举则鸡肋很多,它只是一个标记值而已。

5,泛型

Swift中是支持泛型的,也支持泛型的类型约束等特性。

Objective-C中则没有泛型的概念。

6,协议和扩展

Swift 对协议的支持更加丰富,配合扩展、泛型、关联类型等,可以实现面向协议编程,从而大大提高代码的灵活性。同时,Swift中的protocol还可以用于值类型,比如结构体和枚举

Objective-C中的协议相对于Swift,则显得寒酸很多。OC中提供的optional特性更是成为很多问题的来源,而如果放弃optional又会让实现的代价过大

很多时候,我们明明看到一个类遵循了某个协议,并且在该协议中定义了某方法,但是在运行的时候却因为找不到对应的方法而Crash,这就是因为该方法是optional的,并且在对应的类中没有实现该方法。因此为了方式运行期Crash,我们在调用代理方法的时候需要判断一下能否响应该方法,能响应的时候才会放心去调用。如果要放弃掉optional的话,也就是说每个协议方法都必须要实现,那么当这个协议里面有很多个协议方法的时候,我们在每一个遵循该协议的类里面都要事先所有的协议方法,无论你是否会用到该协议方法。这样的话,实现代价就太大了。

7,函数和闭包

在Swift中,函数是一等公民,可以直接定义函数类型的变量,可以将函数作为其他函数的参数来传递,也可以将函数作为其他函数的返回值。这些特性可以让我们在Swift中进行函数式编程

在Objective-C中,函数仍然是次等公民,我们需要对其进行selector的封装或者利用block来实现Swift中类似的效果。

swiftc:强大的命令行工具

首先来简单看一下一个整个的编译过程是怎么样的:

Swift 简介

C、Objective-C、Swift等语言,它们使用的编译器后端都是LLVM。那么什么是LLVM呢?LLVM是架构编译器的框架系统,是使用C++编写而成的,用于优化程序员编写程序的编译时间、链接时间、运行时间以及空闲时间等。它会对开发者保持开放,兼容既有的脚本。LLVM项目是一系列分模块、可重用的编译器工具链,它提供了一种代码编写良好的中间表示——IR,可以作为多种语言的后端。

整个Swift语言的编译过程如下:

Swift 简介

  1. 对Swift源码进行词法解析,将其转成Swift的抽象语法树AST

  2. 通过一系列工具,编程Swift的中间语言SIL

  3. 接着通过一些分析等,将其转成LLVM的中间表示语言IR

  4. 最终通过LLVM后端生成可执行文件.o

swiftc的命令演示

1,将一个Swift源码文件编译成一个.o可执行文件

进入到想要编译的swift源码文件所在路径,然后执行如下代码:

swiftc -o Norman.out Norman.swift

之后就可以在相同路径下得到一个Norman.o文件,如下:

Swift 简介

然后通过如下命令来执行该可执行文件:

./Norman.out

2,生成抽象语法树

命令如下:

swiftc Norman.swift -dump-ast

Swift 简介

3,生成Swift的中间语言SIL

命令如下:

swiftc Norman.swift -emit-sil

Swift 简介

4,生成LLVM的中间表示语言IR

命令如下:

swiftc Norman.swift -emit-ir

Swift 简介

Swift 简介

5,生成汇编语言

命令如下:

swiftc Norman.swift -emit-assembly

Swift 简介

Swift 简介

Swift 简介

通过上述五个swiftc命令行工具,我们就可以编译和运行Swift文件了。具体的每个文件都是干什么用的,而我们又怎么样去读懂并分析这些文件呢?这些我会在以后花大篇幅来进行总结,这里我们不细究。大家只需要知道有这么一个swifts命令行工具,可以将Swift源码转成各种形式的文件,利用它来进行编译原理的探究,甚至是进行中间语言的优化。

Swift交互式解释器——REPL

REPL是Swift6.1之后引入的一种以交互式的方式来体验Swift的方法,其全称是Read Eval PrintLoop

我们直接在命令行输入swift命令,即可打开REPL

Swift 简介

我们可以在REPL中书写各种各样的Swift代码,如下:

Swift 简介

由上例可知,REPL还可以为我们提示各种各样的错误

下面介绍几个REPL常用的命令:

1,退出

 :q

2,帮助

:help

这个时候,REPL就会为我们列出其所有的可用选项:

Swift 简介

3,将光标移到当前行的开始处

Control+A

4,将光标移到当前行的结束处

Control+E

实际上,REPL在应用开发中并没有什么卵用,我们主要是使用REPL在学习过程中随时了解语言的某个语法,只需要在终端输入swift命令就好了,不用打开Xcode,这样就会很方便。

Playground介绍

playground,翻译成游乐场,顾名思义,playground的设计思想和目的就是以游戏的态度来学习Swift,让人人都能够愉快地学习Swift编程。

playground是2014年随Swift语言一起发布的。2016年,发布了Swift Playgrounds IPad应用, 可以在里面通过游戏场景来快乐学习Swift。

playground发展至今,其功能越来越强大。我们不但可以在里面编写普通的Swift代码,还可以利用liveView的功能来实现界面开发(这一点在前面的基础语法部分已经做了介绍)。

收藏
评论区

相关推荐

Swift 简介
Swift和ObjectiveC的主要区别 1,编程范式 Swift可以面向协议编程、函数式编程、面向对象编程。 Swift语言引入了协议、协议的扩展、泛型等新特性,因此使用Swift语言可以很好地面向协议编程;Swift语言将函数和闭包提升为语言的一等公民,函数可以作为一个变量、可以作为其他函数的参数、作为其他函数的返回值等来传递,所以
Swift 常见面试题解
基础 1、class 和 struct 的区别 2、不通过继承,代码复用(共享)的方式有哪些 3、Set 独有的方法有哪些? 4、实现一个 min 函数,返回两个元素较小的元素 5、map、filter、reduce 的作用 6、map 与 flatmap 的区别 7、什么是 copy on write 8、如何获取当前代码的函
Swift开发-OC与Swift混编以及纯Swift编码所遇到的问题(一)
前言: 最近一段时间比较忙,公司项目比较多,直到现在年后过来以 后总结一下之前项目中遇到的问题,以及自己使用Swift开发所遇到的坑。现在大家都知道Swift已经渐渐趋于完善,以后很有可能会替代ObjectC成为主流的iOS开发语言,所以各位以后还想从事iOS开发的程序猿(媛)们,早作准备吧! 今天我们主要说一下ObjectiveC和Swift混编
Swift开发-OC与Swift混编以及纯Swift编码所遇到的问题(一)
前言: 最近一段时间比较忙,公司项目比较多,直到现在年后过来以 后总结一下之前项目中遇到的问题,以及自己使用Swift开发所遇到的坑。现在大家都知道Swift已经渐渐趋于完善,以后很有可能会替代ObjectC成为主流的iOS开发语言,所以各位以后还想从事iOS开发的程序猿(媛)们,早作准备吧! 今天我们主要说一下ObjectiveC和Swift混编
Swift开发-OC与Swift混编以及纯Swift编码所遇到的问题(二)
上篇在介绍了Swift与OC混编开发所需要准备的一些必要条件 SwiftObjectiveC混编注意事项(https://www.jianshu.com/p/52ab6a316cbe),今天只说一下我在实际项目中所踩过的坑,希望你们以后绕过这些坑吧。 1、 使用cocopods管理Swift文件所遇到的问题: 我们在开发的过程中,各种优秀的框架
iOS 11更新后以及iPhone X推出后工程中遇到的问题及适配
1.UITableView滑动时右侧的滑动条忽长忽短的乱跳以及MJRefresh上拉刷新死循环 这是因为tableView在iOS11默认使用SelfSizing,tableView的estimatedRowHeight、estimatedSectionHeaderHeight、estimatedSectionFooterHeight三个高度估算属性由默
iOS 图片和文字一起上传
最近在忙着开发公司的一个项目,中间遇到很多坑,对于图片的上传在这里我也不做太多的介绍,网上各种大神的资料都有的,今天我主要说一下我再上传图片和文字的时候遇到的一些坑(图文上传我们很多时候都会遇到,遇到多了网上找的各种博客,解决了图文一起上传的问题)废话不多说,直接上代码: / 上传图文 / (void)upLoadImageViewToS
Swift版UITextView自定义占位词,最大长度
最近这段时间在搞一个Swift的项目,算是帮朋友做的吧,虽然有点累但是自己也是从中学到了很多东西,其中自己也封装了一些常用的控件,最近忙完公司的项目以后就整理一下自己的心得。。希望大家一起学习! 最近项目需要,很多的地方都用到了UITextView来实现一些需求,需要设置占位词和最大的长度,这里我是简单的封装了一下,希望大家多多指正,话不多说,上代码:
swift学习笔记-OC与swift区别,从OC到swift你可以看看这个
创建对象 OC:alloc initWith Swift:(XXX:) 调用方法 OC:uicolor redcolor Swift:uicolor.redcolor() 枚举 OC:UIButtonTypeContactAdd Swift:UIButtonType.ContactAdd 输出 OC:NSLog(@"Hello
Swift与Objective-C混合编程之Swift与Objective-C API映射
原创文章,欢迎转载。转载请注明:关东升的博客 Swift与ObjectiveC API映射 在混合编程过程中Swift与ObjectiveC调用是双向的,由于不同语言对于相同API的表述是不同的,他们之间是有某种映射规律的,这种API映射规律主要体现在构造函数和方法两个方面。 1、构造函数映射 在Swift与ObjectiveC语言进行混合
【Swift】Swift 2.0 到 Swift 3.0
问: 报错:The “Swift Language Version” (SWIFT\_VERSION) build setting must be set to a supported value for targets which use Swift. This setting can be set in the build settings editor
Swift - Music 程序分析
本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源App Swift Music的研究心得。 (https://imghelloworld.osscnbeijing.aliyuncs.com/a47a2684664
Swift 简介
1.Swift 开发快速体验 1.1 目标 playground 快速体验 & 学习资源分享 项目开发快速体验,了解 Swift 基本程序结构 1.2 学习资源 苹果官方博客 https://developer.apple
swift - Alamofire 4.0
  在这前,已经介绍并学习过AFNetworking(http://www.cnblogs.com/chenxianming/p/5674652.html)源码了,现在通过阅读学习Alamofire最新源码同时,学习swift 3.0这门语言,虽然
APP 开发技术该如何选型 ?
目前 按照 APP 开发分类,分为以下三大类 原生 APP  \[ Android Swift  \] WEB APP Hybrid App \[混合 APP  \] 在找工作的当中,很多岗位 要求 会开发 H5 App ,那到底什么是H5 APP 呢?一开始我也有点疑惑,没接触这块,按自己理解 就是 采用 HTML5 技术