Tag: 软件工程

记录云原生应用

我的日志文件在哪里? 在回答这个问题之前,让我解释一下上下文。 我在云开发领域工作,我们有一种方法,称为12因素应用程序。 Logs是12个因素之一,这是如何定义该因素的方法。 十二要素应用程序永远不会将自己的输出流路由或存储。 它不应尝试写入或管理日志文件。 而是,每个正在运行的进程将其未缓冲的事件流写入stdout。 在本地开发期间,开发人员将在其终端的前台查看此流,以观察应用程序的行为。 如果您不熟悉12因子应用程序,则可在此处获取有关它的更多信息。 但这对我作为开发人员意味着什么? 答案很简单,我将所有日志都写到stdout。 例如,我迅速编写了下一个很酷的Web服务。 然后,您至少需要这两行内容才能写入stdout。 //禁用缓冲以直接写入stdout setbuf(stdout,nil) 打印(“此行将被打印到标准输出。”) 就是这样,好的,我要说实话,您看到3行代码,但是注释仅用于解释,抱歉。 顺便说一下, setbuf由标准C库提供。 如果您需要不同的日志级别(如调试,错误等),那么您可能对库更感兴趣,库对此提供了支持,并且对日志行的格式也有帮助。 如果我们扩展快速应用程序,那么“ HeliumLogger”将是一个不错的选择。 这个记录器也只写到标准输出,这就是我们需要的一切。 让我们谈谈不同的环境。 如果您在本地计算机上进行开发,则可以在终端中查看应用程序的日志。 但这不是您的应用程序所在的地方。 如果您的应用程序是在Cloud Foundry(CF)提供程序之一上运行的,则可以使用cloud Foundry cli“ cf logs my-swift-app”获取应用程序的日志。 这是可能的,因为Cloud Foundry中的日志路由是由运行时管理的,而输出的一个选项可能是Cloud Foundry cli。 bash $ cf日志打印机-最近 grep APP / PROC / WEB / 0 2017–10–17T22:05:02.03 + 0200 [APP / PROC / […]

认识我们的厨师:뱅크샐러드iOS팀을만나다

与我们的厨师 Chef见面레이니스트지엔지니어링리즈입니다。 App Store更新日期2018年5月14日,在iOS上添加了사내(aka기사네)。 안녕하세요? !기자소개다! 찬울:안녕하세요! 만사한지는되었지만,1分3分째iOS팀에서김찬울입니다。 iOS的첫젝트의게。 보영:나이는가아니지만,입사5개월차이자박보영입니다。 했었는데로벌했었는데했었는데。。일하고일하고일하고일하고다。。있습니 主题:간편결제서비스P앱,서비스개발하다레이 니스 안관수입니다안관수입니다。 레이니스트엔지니어링되셨나요되셨나요되셨나요? 内容: Web팀이사용하는 기술스택 이인상깊어서 Web팀으로합류하게。 중,iOS자원해서이새롭게다는기얘iOS자원해서기될가있었습니다。 없는관련된관련된식하나도없는없는같은데같은데같은데같은데적인적인적인가가가가있나요? 内容:제가서비스를,좋아하는같아서같아서원하게원하게원하게원하게원하게원하게원하게 관수비슷한데요비슷한데요비슷한데요 비슷한데요관수비슷한 데요비슷한 데요비슷한 데요비슷한 데요비슷한 데요비슷한 데요。。。。。。。。。。。。。。。 양한다양한가계부이나와있는데,뱅크샐러드를이유가있나요? 主题:iOS的복사계부붙여넣사-붙여넣기를사실상기로로。 들었어요다뱅크샐러드를용해용해용해입력해주는입력해주는입력해주는들었어요들었어요들었어요들었어요들었어요들었어요 회회는는니니니있던원하게원하게원하게원하게원하게원하게원하게원하게원하게원하게원하게원하게원하게원하게원하게 보영:관수님이랑。 라는이라는,존에는개발라는유유었어요었어요었어요었어요었어요었어요었어요었어요었어요었어요 배우고,배우고사에가면다지사의。 产品6가상용하고용하고용하고앱앱고고서비서비스 。 。로바다。 😆😆 아닌적으를를니니니니아닌아닌니의의의니니니원하게 iOS팀을! 보영:음떠오르는이미지는말로는잘잘잘。 iOS등장한초기부터있고있고,른를를를를를고고고처음처음팀팀팀팀팀팀팀팀팀팀 찬울:이게바로온고지신? 😆 있어요영님영님양한양한술을술을술을도입하고도입하고도입하고도입하고도입하고도입하고도입하고도입하고도입하고도입하고도입하고있어요있어요 在iOS平台上100%Swift升级,在RxSwift가가上。 고리고MVVM향하고향하고향하고향하고。 술적인만만만만만만만만만만만만만공유하고공유하고라고라고라고라고라고라고라고라고라고라고라고만 主题:관수로서로에이피드백이되게이라고。 부분부분부분서피드백을두려워하두려워하두려워하않고않고같아요같아요같아요같아요같아요같아요같아요같아요같아요같아요같아요같아요같아요같아요같아요같아요같아요 内容:iOS版모두금금랑하고너무사랑하고。 […]

软件工程:成瘾者的天堂

直到我大学一年级才开始开发者的旅程。 我曾在高中尝试过编程课程,但我的学校似乎并不太热衷于。 我确实参加了很多数学和科学课程,以及一些动手实践的贸易课程,例如木工和焊接。 我喜欢解决逻辑难题,玩视频和棋盘游戏,并且通常喜欢任何需要策略或批判性思维的东西。 自然,我对软件开发事业非常感兴趣。 当我上大学的第一门计算机课程时,我已经下定了决心要在本科期间完成两件事:1)获得计算机科学学位; 2)了解有关软件的所有知识。 获得学位是一个非常直接的目标,但是我显然不明白完成2分几乎是不可能的,我可以花整个职业生涯来实现这一目标。 当您决定进入基于STEM的职业时,会发生一件有趣的事情。 您可能会想,“我将获得<在这里插入工程专业的学位,然后我将完成学习。” 90秒钟内您都是正确的。 在科技行业,现实世界看起来就像我上大学时熬夜的时候一样,学习新的语言并完善我最近获得的技能。 学习所有的东西 我从学习Basic开始,然后转到Python,C,C ++和SPARC Assembly。 我自学了HTML,CSS,PHP,Javascript和SQL,因此可以找到一份兼职工作。 从那里开始,螺旋式失控。 每个学期,我都用一到两种“熟悉的”语言进行编码,并用三到四种对我来说是新的语言进行编码。 在大学三年级结束时,我已经用大约16种语言工作。 这帮助我找到了新的编码机会,但是这也使得在面试中保持所有语法的一致性非常困难。 上大学的最后一年,我已经尝试了足够多的语言,我的高级项目将有很多选择。 现在回想一下, 如果我没有花时间继续寻找新的语言来学习,那么我可能会陷入对我的高级项目和职业生涯的一条单一道路。 我觉得很多人都认为,如果您拥有计算机科学学位,那么选择一种新语言就变得微不足道了。 当然,我们学会了很多理论,并且学习了语言在幕后的实际工作方式,但是我认为实践最终使每次选择一种新语言变得更加容易。 您会开发使学习过程本身成为可能的技能和习惯,而不是始终知道要学习什么。 迅速陷入深渊 在我作为iOS开发人员的职业生涯的几年中,Swift的第一个版本发布了。 在那段时间里,我几乎一直只在Objective C中工作,没有真正接触其他语言。 斯威夫特出来时我的下意识反应是奔跑。 奔跑无处不在,并坚持使用过多的括号和混合C代码。 Swift刚问世时,我对此表示怀疑。 我看不到如何实现我想要的一切,而且我当然无法像在Objective C中那样快地工作。实际上,我大多只是害怕抛弃对Objective C的熟悉而继续前进新的和不同的。 如果我学不到该怎么办? 如果我在Swift方面不如在Objective C方面成功,该怎么办? 这能使我失去工作吗? 让我们花一些时间来谈论这些问题。 如果我学不到该怎么办? 这太荒谬了-我已经训练自己超过五年了,能够快速,成功地学习新事物。 教育的大部分好处不一定基于我所学的知识,而是基于我的学习方式。 我应该能够做出真诚的尝试来学习Swift。 如果我在Swift方面不如在Objective C方面成功,该怎么办? 这能使我失去工作吗? 简短的回答:绝对可以。 我的一部分工作是编写不会被逻辑错误困扰,易于维护且不会充满误用概念的代码。 如果我无能为力,那么我不应该从事这项工作。 掌握新技能并紧跟最新技术是我高效完成工作的方式。 如果 我无法学习,我将无法做更长的工作。 […]

担任iOS工程师30个月。 给新人的提示。

30个月 7个应用 2个大应用 兼职自由职业者 全职iOS工程师 长期玩家 这是我给新手的iOS开发提示。 以斯威夫特 Swift vs Obj-C我应该首先学习哪个? 我的答案直接针对Swift。 使用Swift学习,播放和开始新项目。 除非您有理由使用Obj-C。 例如,维护旧应用程序。 警告-不打算在Obj-C中启动您的项目,以后再迁移到Swift。 迁移比您想象的要难。 知道生态系统 什么是流行的JSON库? 我的应用程序应使用哪个云数据库? 目前发生了什么事? 您应该了解应用程序的工具/库/框架/堆栈。 不要成为一个孤独的程序员,自己编写一切。 有人已经贡献了这些作品,使您的生活更轻松。 选择并使用它们可以提高生产率。 对于开源库。 搜索` awesome-xxx`。 例如,` awesome-swift` ,` awesome-ios` 。 使它工作,使其正确,使其快速 我一直相信这个概念。 软件开发不是一次性的工作。 好的软件是经过多次迭代制作而成的。 当您第一次做某事时,可能并不如您所想的那样好。 但是,请放心,花些时间重新访问它,并使它变得更好。 只要记住你在做什么。 经验会为您提供帮助。 下一次转到最后一步比您想象的要容易。 学习建筑 看看其他成功的应用程序。 看看它们是如何制成的。 不仅是应用程序方面,还是整个系统。 建筑角度将提高您的工艺水平。 有很多开源的iOS应用。 电报,Firefox,维基百科,WordPress,VLC,电线。 github / open-source-ios-apps是一个很好的资源。 实验 开发应用程序时。 您可能会想出很多主意。 […]

为什么我比Interface Builder更喜欢代码

本文 最初发布在我的博客上 。 像今天许多iOS(和macOS)开发人员一样,我通过遵循Apple自己的教程开始为Apple设备进行开发。 我仍然记得,在2011年并且来自Python和C ++的背景下,在助手编辑器上打开.xib文件和相应的类,然后从一个文件拖到另一个文件以创建IBOutlets和IBActions ,是多么神奇。 我想,“太好了”。 摆脱样板代码而只关注我的应用程序应该做的事情确实令人耳目一新。 没多久,我开始看到依靠这种矛盾的缺点。 特别是当我从从事小型教育项目转为开始与其他开发人员进行大型项目时。 合并地狱 .xib和情节提要板都不是人类可读的。 您应该使用Xcode为您生成的那些文件的漂亮图形表示。 这意味着,如果您和您的同事碰巧在同一个文件上进行工作,那么其中一个将不得不在以后解决合并冲突。 很多时候,合并将涉及随机选择更改,然后在Xcode上打开文件并弄清楚需要做什么以确保文件处于所需状态。 最后但并非最不重要的一点:Xcode只需打开它们即可更改Interface Builder文件。 有时,稍加修改就会导致文件的大量更改(这是因为文件的XML节点在内存中表示为一个集合 ,而集合不能保证顺序)。 其他时候,Xcode只是为了好玩而更改.xib的语法。 紧密耦合,几乎没有编译时间安全 您是否曾经运行过您的应用程序,并确信它会按预期运行,只是在您打开某个视图控制器后看到它崩溃了? 在检查了崩溃的确切原因之后,发现这是未连接的IBOutlet吗? 是的,我们都去过那里。 此外,Interface Builder文件更难重用,甚至更难重构。 几乎不可能单看这样的文件并对文件定义的所有内容都一清二楚。 当涉及到Interface Builder的问题时,我几乎看到了所有事情。 从可能突然使Xcode崩溃的文件仅从打开某个文件到可以使用不同xib实例化的视图控制器开始,并且当使用这些xib中的一个实例化实例时,可能导致崩溃,因为等待它,因为IBOutlet没有该xib上的对应元素,并且由于Xcode生成IBOutlets作为隐式解包的可选变量,因此任何尝试访问该变量的尝试都会导致应用崩溃。 拖拉东西不是我的强项 有一些小事情使通过“界面生成器”添加约束的任务变得异常艰巨。 就像必须移动到下一个布局约束字段一样,以便当我单击“ 添加约束” ,Xcode打开单个Storyboard所花费的时间,或者正在编辑某些内容并使Xcode崩溃时,Xcode不会忽略我的约束。 (然后必须重新打开该项目,并找出最后保存的更改是什么)。 当用代码完成UI工作时,更容易准确地查明发生了什么或需要更改一年前编写的代码中要实现该新功能的内容。 特别是,如果代码是出于良好实践的考虑而编写的,那么所有内容都是明确的,我将确切地知道在哪里查找。 这使我想起了我使用Python多年的乐趣:显式比隐式好。 但是编写自动布局代码是如此冗长而乏味…… 有一些框架可以消除编写自动布局代码的痛苦。 我选择的框架是制图学。 制图使编写自动布局代码极其简单和直观。 只需从项目的自述文件中查看以下示例: constrain(view) { view in view.width == 100 view.height == 100 […]

为iOS应用程序带来动态本地化– Vincent Pradeilles –中

可以在我的 GitHub上找到 一个演示本文内容的演示项目 。 对于用户而言,能够与使用他能理解的语言本地化的应用进行交互具有极其重要的意义。 毫无疑问,iOS在为开发人员提供很少的成本方面提供了出色的性能。 不幸的是,它仅以静态方式提供,这意味着该应用是使用设备的语言环境进行本地化的,但是一旦用户进入应用内部,SDK便无法为我们提供动态更新本地化的方法。 这样的功能仍然可以带来巨大的商业价值。 例如,让我们以一个推销员为例,该推销员使用iOS应用程序在展览会上向潜在客户展示其产品。 并非他遇到的所有人都会说相同的语言,因此能够即时切换其应用的本地化将是一个很好的帮助。 在本文中,我将向您展示如何利用Objective-C运行时的特性来实现此目标,而无需创建新的本地化API。 iOS如何处理本地化? 在iOS应用中, Localizable.strings文件被视为资源,因此使用Bundle类进行存储和访问。 为了更好地了解手头的结构,我们可以检查应用程序的内容: 我们看到,对于每个本地化,都有一个对应的.lproj目录,其中包含本地化的资源。 因此,我们实现动态本地化的策略将是找到一种方法来使应用程序在这些目录之间动态交换。 进入Objective-C运行时 从iOS 11开始,所有应用程序都使用Objective-C运行时运行,Objective-C运行时是一个托管Objective-C兼容类并允许它们按预期进行交互的环境。 对我们来说幸运的是,此运行时公开了一个API,该API允许我们的应用程序与其配合使用。 尽管需要谨慎使用,但它绝对拥有强大的力量。 让我们考虑一下这个函数: 结论 在本文中,我专注于可本地化的字符串,因为它是迄今为止在给定应用程序中最常见的一种本地化资源。 但是,我所描述的解决方案当然可以应用于任何本地化的资源,例如音频文件,视频等。

ReactiveSwift的Promise语法

使用闭包接收异步操作的结果 接收异步操作的结果已经很久了。 在iOS上,它以Delegate,Notification开始。 自从引入Objective-C的代码块以来,它已经演变为使用Swift的Closure。 特别地,闭包是功能编码的核心。 由于它的紧凑表示形式和基于编译器强大推断能力的各种简短公式,它也几乎用于Swift编码的各个方面。 使用Closure处理工作的结果有多种方法。 您可以考虑处理用户操作的结果,例如处理UI事件或处理警报选择结果。 此外,它可以在通过GCD执行异步操作后接收结果,也可以用于通过网络接收数据时的处理。 让我们考虑一下使用Closure调用Restful API之后接收结果的过程。 基本上,您需要一个闭包以在调用成功时接收结果,并需要一个闭包以在失败时接收错误。 您必须将两个闭包对象作为参数传递给调用Restful API的方法。 func getUserProfile(userId:Int,complete:(((JSON)-> Void),failure:((Error)-> Void)){ //成功调用成功,失败调用失败 } 这是最简单的思考方式。 然而,这种类型的封闭物递送和结果接收存在缺点。 上面调用getUserProfile函数的语法如下所示。 getUserProfile(userId:123,complete:{json in //成功动作 },失败:{error in //失败动作 }) 如果要将另一个状态的处理程序添加到getUserProfile,则不方便更改所有其他调用此方法的部分。 另外,如果将多个闭包作为方法参数传递,则不容易理解方法本身的签名,并且阅读起来也不那么好。 应用Promise语法 考虑一下JavaScript的承诺。 处理JS异步操作结果的传统方法是将Callback函数作为参数传递给工作函数。 但是,JS应用程序变得更加复杂,回调函数也变得更大。 同样,如果必须连续执行异步处理,则必须嵌套多个回调函数。 因此,它导致了代码难以阅读的问题。 解决这个问题的承诺已经出现。 可以将Promise对象传递给Task并为其添加一个Handler,而不是将Callback函数作为参数传递给work函数。 结果,诸如处理结果或执行另一任务的代码可以被添加为链。 这种方法解决了回调函数的缺点。 somePromise(task).then((result)=> { //做其他任务 })。then((result)=> { //结果处理 }) 通过上述链结构,一个函数只能包含与一项任务相关的代码,并且可以解决回调函数的嵌套问题。 在iOS开发中,闭包对象很少嵌套。 但是,在iOS中,如前面的示例中所述,类似的是,当将闭包作为函数的参数传递时,函数调用语法很复杂,并且很难修改签名。 因此,让我们创建一个类似于JavaScript的Promise对象,以改进用于异步处理的代码,并使用它来调用Restful API。 换句话说,我想向您展示如何通过以下语法使用getUserProfile。 […]

故事板:已批准,但不推荐

自从在iOS 5中引入情节提要板以来,关于为iOS应用程序构建界面的最佳方法的争论一直很多。 尽管UI的可视化编辑器具有许多优点,但是许多开发人员拒绝使用它们,因为它们无法应对复杂的导航和UI层次结构。 Apple通过向OS X引入情节提要来大力鼓励使用情节提要。实际上,Apple Watch现在已要求使用情节提要,并且所有iOS项目模板默认都使用情节提要。 Xcode的最新更新甚至比以前选择在新项目中退出情节提要更耗时。 在Maxwell Forest,我们禁止使用情节提要板来支持程序化布局。 虽然我们可以看到将故事板用于小型项目和单独开发人员的好处,但我们发现在较大的团队环境中,故事板有很多缺点。 紧随其后,了解使用情节提要的利弊很重要。 长处 1.可视化 情节提要是出色的可视化工具,可封装视图表示和它们之间的过渡(segue)。 组织良好的情节提要可以轻松地从高层次了解应用程序流,功能以及应用程序中的视图如何协同工作。 这种可视化可以使刚接触项目的开发人员更容易掌握最新信息。 一个有效用于简单应用程序的情节提要 2.简单性 故事板也非常适合初学者,因为它们易于设置,并且只需最少的代码即可实现许多功能。 即使没有对自动版式的全面了解,简单的界面也可以快速实现,并且拖放界面对于人们学习如何开发比通过编程方式创建版式更加直观。 3.原型制作 Interface Builder具有强大的实用性:它可以使开发人员在没有设计背景的情况下设计出外观合理的UI。 它还允许熟练的设计人员对应用程序进行原型设计,并在工程师充实数据模型并微调UI细节之前将其显示给利益相关者。 弱点 情节提要的简单性和易用性很好,但是在开发更复杂的应用程序时,这也是它们最大的弱点。 在开发复杂的视图层次结构和交互时,尤其是在团队中工作时,Interface Builder的文件结构,工具和稳定性远非理想。 1. Interface Builder的稳定性和怪癖 Interface Builder已经走了很长一段路,但是仍然有其缺点。 例如,它不能在单个情节提要文件中处理大量屏幕,从而产生滞后并经常导致Xcode崩溃。 往返于关键视图控制器之间需要大量测试的应用程序流程可能很快就会陷入混乱,使在情节提要图板之间难以导航。 使用时,Interface Builder中的大多数操作都需要100%缩放,这进一步降低了可用性,尤其是在视图控制器之间拖动以创建序列时。 通过将情节提要分解为多个文件可以缓解这些问题,但是仍然难以管理,并且降低了情节提要作为可视化工具的有效性。 用于复杂UI的情节提要板可能很快变成一团糟 2.没有清晰界面的代码划分 当开发复杂的UI时,将实现分成两个文件,视图控制器和情节提要会使调试和维护变得烦人。 任何工作都需要在代码编辑器和Interface Builder之间进行上下文切换。 在繁忙的大型故事板上,这可能会令人厌烦并且令人生厌。 3.可重用性 可重用性在软件项目中对于减少重复,增加可维护性和错误至关重要。 故事板鼓励使用重复的视觉设计,并手动更改单个元素而非元素类别的属性。 为了使用情节提要板达到可接受的可重用性水平,必须将它们与NIB或程序化UI设计结合使用。 4.单个文件和合并冲突 对于任何严肃的开发,情节提要的最大缺点是它们是包含应用程序多个视图的单个文件。 在团队合作和使用源代码管理时(这应该一直如此),这会产生戏剧性。 只有一个文件意味着合并冲突要普遍得多,当必须使用XML处理冲突时,合并冲突会变得很混乱,这在使用Interface Builder进行更改后会变得非常棘手。 烦人的是,如果开发人员使用不同版本的Xcode,仅打开情节提要板文件将创建更改,这将导致合并冲突! 可以说,通过合理的任务管理可以使合并冲突最小化,但是大多数应用程序的大部分UI流程都集中在几个主屏幕上,并且大多数情况下,多个开发人员将在彼此非常接近的区域工作。 […]

iOS上的Weaver依赖注入教程(第1部分)

在本教程中,您将探索如何使用依赖注入(DI)和DI容器来开发强大的iOS应用程序。 为此,我将逐步解释Weaver的示例应用程序的编写方式以及原因。 依赖注入 (DI)基本上意味着“给对象一个实例变量” ¹。 这是一种组织代码的方法,以便对象的逻辑可以将其工作的一部分委托给其他对象(依赖项),而无需对其实例化负责。 因此,依赖性也可以作为抽象对象(协议)注入。 事实证明,对象之间的这种松散耦合使代码更具模块化和灵活性,因此更易于进行单元测试。 尽管DI可以手动实现,但对象初始化器很容易变得非常复杂,从而鼓励开发人员使用单例之类的反模式。 通过生成必要的样板代码将依赖项注入Swift类型并确保干净的依赖关系图 , Weaver可以为您提供帮助。 在本教程的最后,您将启动并运行以下应用程序。 在进入代码之前,让我们看看Weaver的功能: 1.扫描Swift代码中的注解 。 2.组装收集的注释以创建依赖关系图 。 3.验证图,寻找潜在的依赖周期和不可解决的依赖 。 4. 生成样板代码 。 请注意,所有这些步骤都是在编译时发生的,因此,如果其中任何一个失败,它将停止项目的编译。 安装Weaver的最简单方法是使用Homebrew。 如果您的计算机上尚未安装它,请运行以下命令: $ / usr / bin / ruby​​ -e“ $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 然后像这样安装Weaver: $ brew install韦弗 如果您不想使用Homebrew,也可以按照项目自述文件中的说明手动安装Weaver。 首先,让我们创建一个名为Sample的项目。 创建在项目根目录下Generated的目录。 在那里,Weaver将生成样板代码。 确保创建目录而不是组 。 现在,项目层次结构应如下所示: 由于Weaver在编译时工作,因此需要在编译发生之前执行它。 最简单的方法是在项目中添加一个构建阶段。 让我们点击按钮Sample -> Sample -> Build […]

面向对象的校长—普通英语

这篇文章讨论了面向对象的原始概念。 在编写代码时,您知道如何将方法声明为私有方法,或者如何从类中进行子类化,而在这里,我尝试用通俗的英语解释这些概念。 这是对每种情况的简单合理解释,以防您想将其解释为六岁的孩子: 遗产: 继承允许我们从类中继承子类。 在面向对象的编程中,类都是层次结构的所有成员,并且只有在继承的帮助下才有可能。 子类从父类继承方法和属性。 这使开发人员可以轻松地重用代码。 抽象: 抽象意味着表示基本功能而不包括实现。 这意味着什么? 抽象是根据事物在继承层次结构中的位置,用更简单的术语(抽象的细节)描述事物的概念或范例。 它有助于表示基本功能,而不必担心实现。 在最抽象的级别上,没有实现细节。 最抽象的概念位于顶部,更具体的思想位于底部。 该图表示抽象概念的一般概念: 接口是一组没有实现的方法。 抽象类包含抽象方法和具体方法,它们必须被继承。 封装形式: 封装用于定义,隐藏和限制访问以外的属性和方法。 它可以防止不必要地访问方法和属性(类是封装数据的容器)。 该访问仅在需要时可用,这由访问修饰符处理: 公开:可从任何地方访问 受保护的:可在相同的包和子类中访问 默认值(无说明符):包内可访问的表格 私有:仅可在同一类中访问,子类不可见 Swift中的访问修饰符可以是一个示例。 多态性: 多态性使我们可以定义在父类中已经声明的方法(在子类中)。 通常有两种类型的多态性: 编译时多态或重载: 您可以定义多个具有相同名称的方法,唯一的区别是方法签名。 运行时多态或覆盖: 您可以使用与父类(或已实现的接口)相同的名称和签名来定义方法。 这使我们能够定义特定于特定子类的方法。