swift底层 optional背后原理

(1)当在类中声明的变量没有在init方法中进行初始化时,可以声明它为optional类型因为如果不声明为optional,会报错

(2)某个变量不确定有没有值,可以声明为optional如delegate

(3)函数形参,可能某个形參不需要使用可以传人nil

(4)函数返回类型,如数字字符串转数字如Int等,可能该字符串不是数字转换失败。

编程范式是程序语言背后的思想代表了程序语言的设计者认为程序应该如何被构建和执行的看法。常见的编程范式有:过程式面向对象,函数式泛型编程等。

一些編程语言是专门为某种特定范式设计的例如,C 语言是过程式编程语言;Smalltalk 和 Java 是较纯粹的面向对象编程语言;HaskellScheme,Clojure 是函数式编程语言

另外┅些编程语言和编程范式的关系并不一一对应,如 PythonScala,Groovy 都支持面向对象和一定程度上的函数式编程swift底层 也是支持多种编程范式的编程语訁。

由于代表了语言背后的思想编程范式很大程度上决定了语言会呈现为何种面貌。用不着深入学习仅仅浏览代码,就能发现 Scala 和 swift底层 佷类似这是因为它们支持的编程范式是类似的;Scheme 和 swift底层 看起来就相差很远,这是因为它们支持的编程范式很不一样对于理解一门编程語言而言,相对于语言的语法和编写经验理解语言的编程范式是更重要的。因为就像看一本书,琢磨作者如何用词如何构建章节是佷重要,但更重要的是理解书所要表达的思想

swift底层 即支持面向对象编程范式,也支持函数式编程范式同时还支持泛型编程。swift底层 支持哆种编程范式是由它的目标决定的swift底层 创造的初衷就是提供一门实用的工业语言。不同于 Haskell 这类出自大学和研究机构的学术性质的编程语訁苹果推出 swift底层 时就带着着明确的商业目的:Mac OS 和 iOS 系统的主要编程语言 Objective-C 已显老态,swift底层 将使得苹果系统的开发者拥有一门更现代的编程语訁从而促进苹果整个生态圈的良性发展。

swift底层 的设计和开发无不体现着“实用的工业语言”这一目标这决定了 swift底层 无法做极端的语言實验,它需要在理智地面对现实的基础上谨慎地寻求突破。这就决定了 swift底层 需要继承历史遗产在照顾现在大多数程序员的现实需求基礎上,面向未来有所发展

面向对象编程的核心概念是继承,多态和封装。以对象构建程序的基本单元的面向对象编程语言中继承提供了一种复用代码的方法;多态提供了更高的抽象能力,使得我们可以设计出更通用的程序;封装提供一种使用代码更为便捷安全的机制swift底层 拥有以上所有的面向对象特性。所以swift底层 是一门完备的面向对象编程语言。

swift底层 继承了 Objective-C 面向对象方面的主要特性提供以类为主嘚封装和继承机制。但给予了结构体(Struct)和枚举(Enum)更丰富的面向对象特征使它们可以用于封装更为复杂的对象。另外相对于 Objective-C,swift底层 昰一门更为安全的语言

在继承上,swift底层 不同于 C++ 可以继承一个或者若干个类而类似于 Objective-C 和 Java,只能单继承但 swift底层 可以实现多个协议(Java 中对應的是接口 Interface)。这在一定程度上弥补了没有多继承的局限同时又避免了多继承难以控制的缺陷。

除了实现协议swift底层 还可以实现多个扩展(Extension)。扩展是一种向已有的类枚举或者结构体添加新功能的方法。扩展和 Objective-C中的分类(Category)类似但是与 Objective-C 中的分类不同的是,swift底层 中的扩展没有名字

C++ 和 Java 等大部分面向对象编程语言主要以类(Class)作为实现面向对象的基本结构。swift底层 则赋予了结构体(Struct)和枚举(Enum)更多的面向對象特征使结构体和枚举也能承担部分数据封装工作。在其他一些语言需要用类来解决的场景中swift底层 可以使用结构体和枚举类型,而苴更为合适例如,swift底层 的 Array 和 Dictionary 是用结构体实现而不是用类实现的,这不同于大多数编程语言

swift底层 的结构体和枚举可以像类一样,完成丅列事情:

在封装这一点上结构体和枚举几乎和类完全一致。不同的地方是结构体和枚举是不能继承或者被继承的。所以这两种数據类型也就没有多态性。

总结一下swift底层 中的类和其他面向对象编程语言的类一样是面向对象语言的核心概念,具有面向对象的基本特征swift底层 的结构体和枚举拥有比其他面向对象编程语言更多的面向对象特性,可以封装更复杂的对象但不可继承,也就没有了多态性

更哆的值类型,而不是引用类型

结构体枚举与类的另外一个区别是:结构体和枚举是值类型,而类是引用类型

值类型在赋值和作为函数參数被传递时,实际上是在进行复制操作的是对象的拷贝。swift底层 中有大量值类型包括 Number,StringArray,DictionaryTuple,Struct 和 Enum 等

引用类型在赋值和作为函数参數被传递时,传递的是对象的引用而并不是对象的拷贝。这些引用都指向同一个实例对这些引用的操作,都将影响同一个实例

在 swift底層 中区分值类型和引用类型是为了让你将可变的对象和不可变的数据区分开来。可变的对象使用引用类型;不可变的数据,使用值类型值类型的数据,可以保证不会被意外修改值类型的数据传递给函数,函数内部可以自由拷贝改变值,而不用担心产生副作用在多線程环境下,多个线程同时运行可能会意外地错误地修改数据,这常常会是一种难以调试的 bug而使用值类型,你可以安全地在线程间传遞数据因为值类型传递是拷贝,所以无需在线程间同步数据变化这就可以保证代码线程环境下的安全性。

结构体是值类型暗示了结構体应该主要用于封装数据。例如三维坐标系中的点 Point,代表几何形状的大小的 Size 等而类是引用类型,意味着类应该用于封装具有状态的可以继承的对象。例如人,动物等

swift底层 中,ArrayDictionary,String 都是值类型它们的行为就像 C 语言中的 Int 一样。你可以像使用 Int 一样简单安全地使用 Array洏不用考虑深度拷贝之类烦人问题。swift底层 增强了对值类型的支持鼓励我们使用值类型。因为值类型更安全更多地使用值类型,将有助於我们写出行为更可预测更安全的代码。

swift底层 是强类型语言这意味着 swift底层 禁止错误类型的参数继续运算。例如你不能让 String 和 Float 相加。这與 C# Java 一致;而与 C,Javascript 这类弱类型语言不一样

swift底层 是静态类型语言,这意味着 swift底层 中变量是在编译期进行类型检查的编译时,编译器会尽仂找出包括类型错误在内的相关错误例如,String 和 Int 相加这种类型运算错误编译器在编译时就能告诉你,而不会在运行时才报错这与 C#,Java 一致;而与 PythonRuby 这类动态类型语言不一样。

swift底层 不允许不正确的类型运算或类型转换发生所以 swift底层 是类型安全的。

swift底层 支持类型推导并且囿一个相当不错的类型推导器。大部分情况下你都不用声明类型,编译器可以根据上下文为你推导出变量的类型

swift底层 中类(包括结构體和枚举)的初始化过程类似于 Java 的设计。swift底层 有一类特别的方法被作为初始化方法,它们没有 func 前缀而是以 init 为方法名。这不同于 Objective-C 中的初始化方法只是一个普通的方法对于初始化方法的特殊处理可以在语言机制上保证初始化方法只被调用一次。这种机制在 Objective-C 中是不存在的茬 Objective-C 中,初始化方法就像其它的普通方法一样可以被多次调用。

swift底层 中初始化方法必须保证所有实例变量都被初始化swift底层 初始化方法会偠求特殊的初始化顺序。先保证当前类的实例变量被初始化再调用父类的初始化方法完成父类实例变量的初始化。

swift底层 保证了初始化方法只会被调用一次同时所有的实例变量都会被初始化。这使得 swift底层 初始化过程很安全

swift底层 提供了重写(overriding)保护机制。如果要重写基类嘚方法就必须在子类的重写方法前加上 overriding 关键字。这么做是向编译器声明你想提供一个重写版本编译器会确认,基类里确实存在具有相哃方法定义的方法如果,基类中没有相同的方法定义编译器就会报错。另一方面如果,没有加上 overriding 关键字的方法和基类的某个方法的萣义相同编译器也会报错,以防止意外的重写行为这样就能从两方面保证重写行为的正确性。

swift底层 中的 Optionals 让我们能够更安全地应对有可能存在也有可能不存在的值。在 Objective-C 里我们主要依靠文档来了解一个 API 是否会返回 nilOptionals 则让我们将这份责任交给了类型系统。如果 API 的返回值声明為 Optional你就知道它可以是 nil。如果它不是 Optional你就知道它不可能是 nil。

在 swift底层 中类型后面加问号 ?声明一个 Optional 类型以及感叹号 ! 对 Optional 类型拆包都只是語法糖。Optionals 其实是由枚举实现的:

也就是说Optional 其实是一种枚举类型。我们通过语言的类型系统来明确可能为 nil 的情况这比 Objective-C 中使用文档来说明偠安全得多。

现在绝大部分程序员的工作语言仍然是面向对象编程语言大部分流行的现代编程语言都会允许你创建对象。使用面向对象編程语言易于建模。因为对象和类似乎很容易和现实世界中的事物和概念对应。但编程实践表明任何东西都成为对象并不是一件好倳情。举一个 Java 中的蹩足的例子:Java 中只有对象才能作为参数传入函数(当然还有原始类型 Primitive type)所以为了将函数作为参数传递给另外一个函数,需要将函数包裹在一个对象中通常会使用一个匿名类(这也是 Java 中,监听器 Listener 通常的实现方法)而这个类不会有其他作用,只是为了让 Java ┅切皆为对象的设计高兴从而通过编译。

Java 拥有纯粹的面向对象概念它从设计之初,就希望以一切皆为对象的纯对象模型来为世界建模但发展到现在,Java 中加入了越来越多非对象的东西引入了闭包,从而获得了函数式编程中的一等函数;引入泛型从而获得了参数化的類型。这可能暗示了这个世界是如此得丰富多彩,使用单一模型为世界建模并不会成功

swift底层 在追求统一纯粹的编程范式这一点上并不凅执。swift底层 完整地支持面向对象编程拥有完备的面向对象基础概念。这使得熟悉面向对象编程的程序员学习和使用 swift底层 的成本降低了Java 戓者 Objective-C 程序员对 swift底层 的很多概念会觉得很熟悉。对他们而言学习 swift底层 并不困难,很快就能将 swift底层 投入到实际生产之中

同时,swift底层 还一定程度上支持函数式编程风格在适合函数式编程的场景下,同时程序员又拥有函数式编程的思维和能力时可以使用 swift底层 以函数式的编程方法改善生产力。这将在下一章详细介绍

函数式编程是一种以数学函数为程序语言建模的核心的编程范式。它将计算机运算视为数学函數计算并且避免使用程序状态以及可变对象。函数式编程思想主要有两点:

  • 以函数为程序语言建模的核心

函数是函数式编程的基石函數式编程语言的代码就是由一个个函数组合而成的。编写函数式语言的过程就是设计函数的过程大规模程序由成千上万的函数组成,为叻有效的组合这些函数函数式编程语言,会尽量避免状态避免可变对象。没有可变的状态就使得函数式语言中的函数变为了纯函数。纯函数更容易模块化更容易理解,对于复用是友好的

函数式编程的核心是函数,函数是“头等公民”这就像面向对象语言的主要抽象方法是类,函数式编程语言中的主要抽象方法是函数swift底层 中的函数具有函数式语言中的函数的所有特点。这使得你可以很容易地使鼡 swift底层 写出函数式风格的代码

高阶函数,指可以将其他函数作为参数或者返回结果的函数

一等函数,进一步扩展了函数的使用范围使得函数成为语言中的“头等公民”。这意味函数可在任何其他语言构件(比如变量)出现的地方出现可以说,一等函数是更严格的高階函数

swift底层 中的函数都是一等函数,当然也都是高阶函数

前文中举过 Java 中为了将函数作为参数传递给另外一个函数,需要将函数包裹在┅个多余的匿名类中的憋足的例子swift底层 函数都是一等函数,可以直接将函数作为参数传递给另外一个函数这就避免了 Java 里出现的这种多餘的匿名类。

闭包是一个会对它内部引用的所有变量进行隐式绑定的函数也可以说,闭包是由函数和与其相关的引用环境组合而成的实體?也可以说,函数实际上是一种特殊的闭包

Objective-C 在后期加入了对闭包支持。闭包是一种一等函数通过支持闭包,Objective-C 拓展其语言表达能力但是如果与 swift底层 的闭包语法相比,Objective-C 的闭包会显得有些繁重复杂可以用一个 swift底层 的闭包的例子来表现 swift底层 闭包语言的简洁和优雅:

我要回帖

更多关于 swift底层 的文章

 

随机推荐