Swift for Ruby Devs:类型系统

在开始学习Swift的过程中,您首先要注意的主要事情之一是Swift和Ruby之间的类型系统之间的差异。 清楚地了解这些差异将帮助您更好地了解如何编写Swift以及为什么我们必须做一些不同的事情。

差异:动态类型与静态类型

如果您是Ruby开发人员,那么您将生活在一个动态类型的世界中,可以自由地编写表达性代码,而不必指定变量将包含的对象类型或方法将作为参数接受的对象类型。 在设计接口时,您可能不习惯于类型方面的考虑。 这是因为Ruby并不真正在乎对象的类型 ,只要它们响应发送给他们的方法(或消息)即可。 从技术上讲,对象的类型是由其消息定义的,而不是由对象的类定义的。 动态类型化意味着事物的类型可以在程序过程中进行更改,因为在使用事物之前不会确定类型。 例如,这允许我们将变量定义为字符串,然后将该变量重新定义为任何其他类型的对象。

例:

  my_variable =“这是我的字符串” 
=>“这是我的琴弦”
  my_variable = SomeClass.new 
=>#

另一方面,Swift是一种静态类型的语言。 这意味着我们必须在代码中声明对象的类型 ,以便编译器在编译程序时可以使用这些类型声明来检查类型错误。 但是,在Swift中,如果您为变量设置初始值,则不必显式声明对象的类型。 然后,编译器将在编译时推断对象的类型(稍后将对此进行更多介绍)。 在这里,事物的类型必须在设计软件时确定,而不是像Ruby那样在运行时确定。 这意味着,一旦声明了类型,就无法再更改。

例:

  var myVariable =“这是我的字符串” 
=>“这是我的琴弦”
  myVariable = 123 
=>错误:无法将类型“ Int”的值分配给类型“ String”

差异:类型安全

类型安全性是指编程语言强制执行可以对某些类型执行的操作的程度。 如果一种语言可以执行的唯一操作是该类型可以接受的操作,则该语言是类型安全的。 Swift是一种类型安全的语言,而Ruby不是。 在类型安全的语言中,您必须清楚代码可以使用的值的类型。 例如,您必须清楚变量将包含的对象类型或方法将用作参数的对象的类型。 您还必须清楚方法将返回的对象类型。 因此,如果将变量声明为String类型,则以后不能将其更改为Integer。 如果某个方法希望接收Float类型的参数,则不能传入Double类型的参数。 如果尝试这样做,编译器将捕获这些类型不匹配的内容并将其标记为错误。

在Ruby中,您无需声明变量将包含的对象类型,方法将接受的对象类型或方法将返回的对象类型。 如前所述,Ruby并不真正在乎对象的类型 ,只要它响应发送给它的消息即可。 在这里,对象是由它们的消息定义的,而不必由它们的类型定义。 每个类都定义一个合同,它是公共接口。 以这种方式考虑,可以对类执行的唯一操作是属于其公共接口的那些操作。 但是与Swift这样的类型安全语言不同,我们不必明确说明代码可以使用的值的类型。

相似之处:强类型和类型推断

这些语言要注意的两件事是它们都是强类型语言,并且使用类型推断来推断对象的类型,因此我们不必显式声明它。 强类型语言意味着,如果传递给方法的参数不是期望的类型,则它将在运行时或编译时出错。

例:

  my_number =“ 3” 
=>“ 3”
  my_number + 4 
=> TypeError:没有将Fixnum隐式转换为String
  var myNumber =“ 3” 
=>“ 3”
  myNumber + 4 
=>错误:二进制运算符“ +”不能应用于类型为“字符串”和“整数”的操作数

从上面的示例中可以看到,当将String实现的+方法传递给整数而不是另一个字符串时,会出现错误。 还要注意,我们在这两个示例中都使用了类型推断。 在声明my_number或myNumber变量时,我们不必显式声明将包含在这些变量中的对象的类型。 类型推断是指通过检查存储在变量内的对象或作为参数传递给方法的对象,在编译时或运行时自动推断变量的类型或方法的类型签名的能力。

旁注:在Swift中,如果需要,我们可以显式声明一个类型,但这不是必需的。

例:

  var myNumber:字符串=“ 3” 

相似之处:面向对象的编程

Swift和Ruby的另一个相似之处是它们都是面向对象的编程语言。 诸如继承,子类型,类和对象之类的概念都存在于Swift中。 您可以转移您对面向对象设计原理的知识,例如单一职责,开闭,liskov替换,接口隔离和依赖关系反转(SOLID),以帮助您设计易于更改和维护的Swift应用程序。

摘要

如果您了解两种编程语言之间的主要区别,那么从Ruby到Swift的过渡相对容易。 Swift是一种静态类型和类型安全的编程语言,它使您在设计接口时更加清楚程序将使用的对象的类型,并更加仔细地考虑这些类型。 静态类型具有它的好处,并且由于我们必须声明类型或由于类型的不可变性,因此不应立即忽略它。 随着我们开始学习Swift,静态类型化的好处(例如让编译器检查类型错误)将变得更加明显。 来自动态类型化的世界,这将帮助您成为更好的程序员,因为您将接触到不同的编程概念。 允许您在两者之间进行比较,并为手头的工作选择合适的工具。

这些语言最显着的相似之处之一是它们都是面向对象的,因此设计界面的理念是相同的。 掌握了这些知识之后,我们现在就可以开始研究Swift的语法,在与Ruby的相似之处之间进行比较,并了解其差异。 在以后的文章中,我们将深入探讨Swift的语法,并讨论诸如变量,常量,运算符,集合之类的基础知识。