学习Swift和iOS开发第10部分:类

如果您刚刚开始学习编码之旅,那么您可能听说过面向对象编程。
它是一种广受认可的编程模型,它经受了时间的考验。 它开始达到可以被其他更现代的模型(如Protocol-Oriented Programming所取代的地步,但是理解它仍然非常重要。

类是OOP(面向对象编程)的关键组成部分,它使我们能够创建排序的蓝图,然后根据需要对其进行复制和修改。

一个例子可以是汽车工厂中的汽车。 想象一下,工程师为汽车创建了一个蓝图。 在工厂中,您可以按照蓝图中列出的计划,使用该蓝图创建同一辆汽车的多个副本。

让我们创建我们的头等舱,并使用上面的car示例。

配置

首先,如果尚未打开Xcode,请点击Create New Playground
给它起一个类似“班级”的名称,然后单击“ Next
选择某个位置以保存此.playground文件,然后单击“ Create以保存它。
您应该会看到类似下面的屏幕。

删除左侧的所有样板代码,但根据需要保留import UIKit

创建您的第一堂课

在您的Playground窗口中,输入以下内容来创建一个类:

 车辆类别{ 
  } 

我们使用了关键字class后面加上了Vehicle类的名称。

最好的做法是,以大写字母(即“车辆”,“摩托车”,“踏板车”)开头课程名称。

添加变量和函数

现在,我们需要为我们希望所有汽车拥有的属性添加变量。 像这样:

 车辆类别{ 
var轮胎= 4
var大灯= 2
var马力= 468
var model =“”

func drive(){
//加速车辆
}

func刹车(){
//停止车辆
}
}

如您所见,类可以具有描述它的属性(例如, tiresheadlightshorsepowermodel )和函数(例如, drive()brake() )。

了解面向对象

要了解OOP,您确实需要尝试形象化您周围的世界。 对于更具艺术性且有设计头脑的人来说,这个概念通常很容易理解,因为您可以轻松地将事物可视化为对象。

如果您的大脑更多地在数字和逻辑方面进行操作,这可能很难理解,因为您可能希望将其全部转换为数字或某种算法。

这是另一个示例,我希望这有助于进一步解释OOP。

Instagram的用户可以喜欢其他照片,因此您可能拥有一个User对象,其中包含用户ID,帐户,密码以及其他属性。

该用户可能还具有以下功能: resetPassword()deleteAccount 。 甚至Instagram上的照片也可能是物体。

如果我们有Photo类,则它可能具有以下属性: selectedFilternumberOfLikesnumberOfComments
Photo可能具有的某些功能可能是: addLike()removeLike() —对该对象执行的某种操作。

开始尝试从现实世界的对象的属性和功能(它们的本质和作用)方面着手。
您周围的所有内容都可以放入代码中的对象中。

创建一个类的实例

让我们通过在Playground的底部添加以下内容来创建Vehicle类的实例:

 让delorean = Vehicle() 

我们创建了一个称为delorean的常量,并通过键入“ Vehicle”并在其后加上括号将其初始化为Vehicle类的实例(或副本)。

上面的model属性被初始化为上面的空字符串,所以我们给我们的车起一个模型名。

 让delorean = Vehicle() 
delorean.model =“ DMC-12”

在Playground的底部再创建我们的班级的一些实例:

 让delorean = Vehicle() 
delorean.model =“ DMC-12”
 令bmw = Vehicle() 
bmw.model =“ 328i”
 让福特= Vehicle() 
ford.model =“ F150”

你知道发生了什么吗? 我们曾经为Vehicle编写过一次代码,但是我们创建了该代码的多个实例并设置了它的属性。

我们也可以调用Vehicle的函数。 就像您知道的那样,一旦我们创建了一个类的实例,就将其称为对象。
就像汽车离开工厂一样,它也被视为一个对象。

通过向您的游乐场添加以下内容来进行尝试:

 让delorean = Vehicle() 
delorean.model =“ DMC-12”
delorean.drive()
 令bmw = Vehicle() 
bmw.model =“ 328i”
 让福特= Vehicle() 
ford.model =“ F150”
福特.brake()

我们在delorean对象上调用drive() ,在ford对象上调用brake()
我们已经告诉这些对象做一些事情。

再说一遍,把一个类像一个蓝图,想想它是否具有任何我应该注意的属性? 它有什么能力或可以做什么? 在大多数情况下,答案是肯定的。

类是引用类型

在Swift中,有引用类型和值类型。 它们是不同的,但是我们今天只需要了解引用类型。

我不会深入了解它的含义,只是现在对您作为读者的含义。

为了演示类如何是引用类型,请添加以下函数并在Playground的底部打印ford.model

  func passByReference(车辆:车辆){ 
vehicle.model =“奶酪”
}
  print(ford.model)//打印“ F150” 

接下来,调用passByReference(vehicle:)并传入ford模型:

  func passByReference(车辆:车辆){ 
vehicle.model =“奶酪”
}
  print(ford.model)//打印“ F150” 
  passByReference(vehicle:ford)//通过引用传递福特类 
  print(ford.model)//打印“奶酪” 

我想当我们声明ford时,我们使用let使其成为常数!
如何更改模型值? 好吧,简单地说,一个对象在内存中有一个引用。

您无法复制对象。 可以复制诸如Integers和Doubles之类的东西,因为它们是值类型,而不是对象。

这是另一个示例,显示按引用传递的工作方式。 将以下变量和函数添加到Playground的底部:

  var someonesAge = 20 
  func passByValue(age:Int){ 
年龄= 10
}

您可能会注意到Xcode显示错误,提示age是一个let常数。
因为Integer是值类型,所以我们不能像引用类型一样修改它。 让我们尝试调用我们的函数并传入someonesAge

  var someonesAge = 20 
  func passByValue(age:Int){ 
年龄= 10
}
  passByValue(年龄:someonesAge) 

Xcode不允许这样做。 引用类型可以修改并将它们存储在内存中的特定位置,但是值类型(即Integer,Double,Float等)无法修改,但可以复制。

包起来

这篇文章涵盖了面向对象编程中的类的基础知识。 一个类可以包含描述它的属性以及它可以执行的动作(功能)。

我们也可以通过实例化它来创建一个类的副本。 尽管这可能仍然令人困惑,但您将在本系列文章的全文中继续使用它,这将帮助您快速理解。

继续进行研究,并始终对学习编码保持好奇。 永远不要满足于做得足够多或知道太多。 我们总是可以通过各种方式来提高和成为更好的程序员。