Tag: 编程语言

快速收集类型…

Swift提供了三种主要的集合类型来存储值的集合。 他们是: 数组→有序 价值观的集合 字典→键值对/关联的无序集合 集合→唯一值的无序集合 迅速地,所有这些收集类型都严格限制了它们的类型,这意味着我们不能在用特定类型定义的这些类型中插入其他类型的值。 因此,由于存在强类型系统,我们可以肯定地在检索中,该元素与定义该集合的类型相同。 注意 : 这些集合可以使用任何类型声明和定义,只要在项目中定义了该类型即可。 在Foundation Framework中,这些集合实现为通用集合,因此可以使用任何类型定义它们。 注意 : 快速编写KVO和KVC编译代码时,不会编译用用户定义类型定义或声明的集合。 因为Objective -C Runtime不知道那些迅速定义的用户定义类型。 集合的可变性: 在声明集合类型时,即数组,字典或集合,如果将其分配给变量,则该集合将是可变的(可以更改)。 这意味着我们可以通过添加元素,删除元素或修改它们来更改集合。 在定义集合时,如果将其分配给常量,则它是不可变的(其大小和内容无法更改)。 注意 : 在不需要更改集合的情况下,使用不可变集合是一个好习惯。 因为对于不可变类型,其编译时性能和优化要优于可变计数器部分。 ***所有屏幕截图均为自解释,并提供注释说明。 请通过他们了解更多详细信息*** →数组:将相同类型的值存储在有序列表中。 相同的值可以在列表中的不同位置多次出现。 句法 : – Array [ ElementType ] //这是常用的简写语法 在上面的语法结构中, ElementType是允许存储的值数组的类型。 Swift的Array类型还提供了一个初始化程序,用于创建具有特定大小的数组,其所有值均设置为与初始化程序传递的值相同。 我们使用重复参数传递所需类型的值,并使用参数count传递值在数组中需要重复的次数 。 我们可以通过添加与加法运算符兼容的相同类型的现有数组来创建新数组。 我们还可以使用数组文字初始化数组,这是将一个或多个值写为数组集合的一种简便方法。 在下图中, firstArray用Array文字初始化。 访问和修改数组: 我们通过数组的方法和属性或使用下标语法来访问和修改数组。 我们可以使用下标语法从数组中检索一个值,在数组名称后紧跟的方括号内传递值的索引。 在访问下标语法时,它必须有效,否则我们会遇到运行时错误。 →集合:将相同类型的不同值存储在无序列表中。 当我们要存储唯一值并且不需要顺序时,我们更喜欢使用它们。 类型必须是可哈希的才能存储在集合中。 […]

在Swift中实现编程语言—第8部分:函数

注意:这是“用Swift编写编程语言”教程系列的第八部分。一定要检查一下 以前的内容 。 在先前的教程中,我们已经实现了一个小计算器解释器,该解释器支持变量声明和表达式。 下一个要添加的功能是对功能的支持,在本教程中,我们将介绍功能支持的陷阱,并讨论如何实现它。 设计功能声明 过去,某些编程语言在函数定义方面颇具创意。 从Objective-C: //实例 -(无效)myMethod:(字符串)参数 // 静态的 +(无效)myStaticMethod:(字符串)参数 要使用JavaScript的箭头功能: (参数)=> {…} 但是自C语言以来,大多数编程语言都是相当传统的语言,并遵循C样式定义: :: = (){} 其中, 导致某些字符序列(一个单词)。 那么……我们的功能应该如何? 通常,在实现一种语言时,我们希望在创造性和传统方法之间找到一个甜头。 我们希望使用我们的语言的程序员可以谈论一些话题,同时又希望我们的语言直观易读。 但是,由于我们出于教学目的而设计语言,因此我们只是希望事物尽可能直接和传统。 因此,我们语言中的函数看起来与传统的C样式函数定义非常相似: 函数someFunction(firstArgument,secondArgument){…} 我们的语言没有类型检查,因此我们将使用关键字“ function”来标记函数定义的开始,而不是在参数列表中使用传统的返回类型和跳过类型规范。 最后,我们在函数的代码块周围使用匹配的大括号。 实施思路 在上一教程中,我们讨论了添加对变量的支持,事实证明这很简单,只需四个简单步骤: 我们为变量声明添加了一个struct 我们在解析器中添加了一个parse方法来创建该结构的实例 我们为变量及其值添加了全局内存存储(一个简单的字典) 我们实现了该结构的解释过程,该过程简单地存储了变量声明的表达式的解释值,并使用变量名作为键将其存储在我们的全局变量字典中。 我们可以用不到50行的代码来完成所有这些工作。 添加功能是一个相似的过程,但是在内存存储方面有两个主要区别(3)。 我们将需要字典将其映射到Node值而不是当前Float ,以便可以懒惰地评估该节点。 处理变量时,我们的内存存储区必须牢记范围。 范围处理 当涉及范围处理时,有两种方法值得一提。 我们可以有词汇范围或动态范围 。 词汇范围 这是大多数编程语言所使用的。 在词法作用域中 ,变量的解析取决于它们在源代码中的位置。 动态范围 对于动态范围,变量的解析取决于运行时的用法: var x = […]