学习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刹车(){
//停止车辆
}
}
如您所见,类可以具有描述它的属性(例如, tires
, headlights
, horsepower
, model
)和函数(例如, drive()
, brake()
)。
了解面向对象
要了解OOP,您确实需要尝试形象化您周围的世界。 对于更具艺术性且有设计头脑的人来说,这个概念通常很容易理解,因为您可以轻松地将事物可视化为对象。
如果您的大脑更多地在数字和逻辑方面进行操作,这可能很难理解,因为您可能希望将其全部转换为数字或某种算法。
这是另一个示例,我希望这有助于进一步解释OOP。
Instagram的用户可以喜欢其他照片,因此您可能拥有一个User
对象,其中包含用户ID,帐户,密码以及其他属性。
该用户可能还具有以下功能: resetPassword()
或deleteAccount
。 甚至Instagram上的照片也可能是物体。
如果我们有Photo
类,则它可能具有以下属性: selectedFilter
, numberOfLikes
, numberOfComments
。
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等)无法修改,但可以复制。
包起来
这篇文章涵盖了面向对象编程中的类的基础知识。 一个类可以包含描述它的属性以及它可以执行的动作(功能)。
我们也可以通过实例化它来创建一个类的副本。 尽管这可能仍然令人困惑,但您将在本系列文章的全文中继续使用它,这将帮助您快速理解。
继续进行研究,并始终对学习编码保持好奇。 永远不要满足于做得足够多或知道太多。 我们总是可以通过各种方式来提高和成为更好的程序员。