Tag: 面向对象

Swift中的设计模式:第二部分-行为设计模式

在该系列的第一篇文章中,我讨论了创意设计模式。 现在,我将描述另一组称为行为设计模式的模式。 行为设计模式处理对象之间的交互方式。 它描述了对象之间如何进行通信,以及如何在不同对象之间破坏任务的步骤,从而提供了更大的灵活性并使得代码更具可测试性。 让我们跳到以下10个行为设计模式: 1.责任链 责任链是一种行为设计模式,可让我们在一系列处理程序之间传递请求,其中每个处理程序都决定处理请求或将请求沿着处理链传递。 有一个名为“ 级别”的枚举将“体育”管理细分为三个级别:州,国家和国际。 首先,让我们创建一个名为Sports的类,它将仅保留当前的体育管理水平。 然后,我们有了称为GameManagement的协议,该协议可以沿处理程序链传递责任。 StateSportsTeam , NationalSportsTeam和InternationalSportsTeam类实现了此协议。 如果运动级别不属于他们的管理层,他们会将责任转移给更高的管理层(或管理人员链)。 在操场上运行代码: 让 stateSportsTeam = StateSportsTeam() 让 nationalSportsTeam = NationalSportsTeam() 让 internationalSportsTeam = InternationalSportsTeam() stateSportsTeam.nextLevelManagement =国家运动队 nationalSportsTeam.nextLevelManagement = internationalSportsTeam let sports1 =体育(级别:Level.international) stateSportsTeam.manage(sports:sports1) let sports2 =体育(级别:国家级) stateSportsTeam.manage(sports:sports2) let sports3 =体育(等级:Level.state)stateSportsTeam.manage(体育:sports3) 输出: 由国际体育管理公司管理 由国家体育总局管理 由国家体育总局管理 2. 命令模式 在命令模式中,将执行命令的类(称为Invoker )与产生命令的类( ConcreteCommand )和知道如何执行该命令的类( Receiver […]

JSON Wars:可编码⚔️Unbox

最初发表在 Swift Post上 。 Codable让所有人都感到兴奋,因为我们都喜欢解析JSON,并且很高兴将此工具作为标准库的一部分。 现在是时候测试它是否值得成为我们最喜​​欢的一个了。 让我们看看Codable在恶劣条件下的性能。 我们将使用Codable解析以下JSON,然后将其与流行的Unbox / Wrap实现进行比较。 { “placeName”: “İstanbul, Turkey”, “lat”: 41.0049823, “lon”: 28.7319958, “dateAdded”: “2018-05-25”, “info”: “İstanbul is a very historical city.” } 我们希望我们的数据模型如下所示。 struct Place: Codable { let name: String let coordinate: Coordinate let dateAdded: Date let info: String? } struct Coordinate { let latitude: Decimal let longitude: Decimal […]

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

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

iOS面试问题:基础知识

是的,许多伟大的作者已经讨论了这个话题,他们有很多的问题和答案。 在我的这篇文章中,我没有做任何不同的事情,尽管我认为分享我的采访经历会很棒。 那么从哪里开始呢? 诚实的答案将来自“ 基础知识 ”。 而且基础是Oops概念。即面向对象的编程概念。 如果面试官是有经验的人,他或她肯定会从此开始。 因此,在本文中,我们将介绍Oops概念。 对于与此相关的问题,我们应该准备好至少一个衬纸答案,并在需要时提供示例。 问:什么是面向对象编程? 面向对象编程是一个概念,它涉及现实世界中的对象以及操作这些对象的方法。 目标C / Swift中的基本概念: 类 :类是一组属性和方法。 //迅速 类Person:NSObject { var firstName:字符串? var lastName:字符串? var age:整数? func printFullName(){ //一些要打印的代码 } } // Objective-C @interface Person:NSObject @ property(强原子)NSString * firstName; @property(强原子)NSString * lastName; @property(assign,atomic)int age;-(void)printFullName; @结束 对象 :对象是类的实例。 //迅速 var person1 = Person()//目标C 人* person1 = […]

使用委托模式在控制器之间进行通信。

降低应用程序复杂性的一种好方法是委托模式。 这个想法非常简单:您无需在当前上下文中包含某些行为的代码,只需向上下文提供一个委托对象,然后由该委托对象的方法执行操作。 这与继承之上的构成保持一致:您的代码避免了超类及其子类之间的紧密耦合。 通过避免继承,您的代码可以更容忍修改。 通过使代码更具模块化,您可以避免处理过多职责的大型对象,从而使维护变得更容易。 这是一个简单的例子: 协议音箱{ 函数speak(); } 猫类{ 共鸣箱人声和弦 函数meow(){ vocalChords.speak() } } KittyVocalChords类实现了Soundbox { 函数speak(){ printToTerminal(“喵”) } } 猫玛丽亚= Cat.new() catVocalChords = KittyVocalChords.new() marya.vocalChords = catVocalChords 猫需要知道如何喵喵叫,但是猫可能还有其他不需要注意的行为。 将它们保持为单独的对象可以使您的声乐班级完成它的声乐事务,而猫则将其完成猫的事务。 您可以将所有这些信息转储到cat类中,但这会使cat类变得更加复杂,因此更加难以阅读和推理。 另一个选择是使用所需的方法定义基类,这将降低复杂性,但是现在您已经与该基类绑定不健康。 对基类所做的任何更改都会影响继承者。 例如,如果您希望狗类也继承定义语音行为的同一基类,该怎么办? 那计算机课呢? 除此之外,更改行为就像更改委托一样简单: 如果environment.dominate_gas ==氦{ marya.vocalChords = sweakyKittyVocalChords } else,如果environment.dominate_gas == NITROGEN { marya.vocalChords = normalKittyVocalChords } 我们唯一需要担心的是代表。 猫类从来不需要为在不同气体中的行为而烦恼。 因此,撇开人为的例子,这在iOS开发中具有价值。 在我正在开发的健身应用中,我使用容器视图。 […]

SOLID原理及iOS和Swift中的示例(第2部分)

在第1部分中,我解释了最重要的两个原则(单一职责和开放/封闭)。 如果您想学习,请点击以下链接: iOS / Swift中的SOLID原理与示例(第1部分) SOLID原则相对较旧,但适用于任何语言的任何OOP代码库的概念都非常有用。 medium.com 在这一部分中,我将尝试解释Liskov替代和界面分离原理。 里斯科夫换人原则: Liskov替换原理(LSP)指出,程序中的对象应该可以用其子类型的实例替换,而不会改变该程序的正确性。 这意味着当您从类或抽象类继承或实现接口(协议)时,无论使用了您的子类接口或类,您的对象都应该是可替换和可注入的。 该原则通常被称为按合同设计,或者在Swift社区中最近被称为面向协议的编程 。 此原则的主要信息是,您不应违反从您的子类继承来的接口要履行的约定,并且通过子类化,这些子类可以在以前使用超类的任何位置使用。 例如,如果我们有PostsStorage类 ,那么根据Liskov的“替换原理”,我们可以说,如果我们从它继承子类 ,我们将其称为BetterPostsStorage ,那么在所有使用原始PostsStorage的地方 ,我们都可以使用BetterPostsStorage ,而我们的应用程序将请勿以任何方式破坏或行为不检。 接口隔离原理: 接口隔离原理(ISP)表示,许多特定于客户端的接口比一种通用接口要好。 它还指出,不应强迫任何客户端依赖和实现不使用的方法。 这就是说,当您创建类要实现的接口(协议)时,您应该努力并依赖于抽象性而不是特异性,但是直到浪费成为浪费,在这种情况下您必须实现一堆新类甚至不需要的方法采用。 如果您想了解接口和继承之间的区别,请先阅读以下文章:https://medium.com/@ansujain/interfaces-vs-inheritance-in-swift-1f48c85948b8 缺少一个更好的(简短的)示例,让我们假设我们具有以下类和接口: 协议WorkerInterface { func eat() func work() } 类Worker:WorkerInterface { func eat(){ 打印(“工人在吃午餐”) } func work(){ 打印(“工人的工作”) } } 类承包商:WorkerInterface { func eat(){ 打印(“承包商吃午餐”) } func work(){ 打印(“承包商的工作”) } } […]

Swift中的设计模式:第一部分-创新设计模式

设计模式是针对软件工程问题的不同解决方案。 没有它们就可以构建软件 但要困难得多。 我将发布有关设计模式的三部分系列。 在这篇文章中,我将讨论创意设计模式。 创建设计模式是处理对象创建机制的设计模式,试图以适合情况的方式创建对象。 对象创建的基本形式可能会导致设计问题或增加设计的复杂性。 创新设计模式通过某种方式控制此对象的创建来解决此问题。 资料来源:Wikipedia.org 在这里,我们将讨论五个创新设计模式以及如何快速使用它们。 这种类型的设计模式用于通过克隆称为原型的现有对象来实例化新对象。 您会看到Apple类实现的Fruit协议的抽象克隆函数,该函数实际上返回当前对象本身。 让我们在操场上运行上面的代码。 //创建原型 let prototype = Apple(count:4)//创建现有对象的副本 让redApple:Apple = prototype.clone()为! 苹果 redApple.count // 4 //添加自己的属性 redApple.set(价格:“ $ 2”) redApple.price // $ 2 //创建现有对象的副本 让greenApple:Apple = prototype.clone()为! 苹果 greenApple.count // 4 //添加自己的属性 greenApple.set(价格:“ $ 4”) greenApple.price // $ 4 • 克隆对象时,该对象的所有属性都将复制到 另一个对象。 •当您需要创建对象而又不知道该类的层次结构时,应使用此设计模式 这是最常用的设计模式。 基本上,它只是抽象对象的创建。 […]

Swift中面向协议的编程

通讯协定 Swift协议基本上是类/结构/枚举的契约,用于实现一组特定的方法和属性。 //协议示例 协议TableCellProtocol { func buttonTapped() } Swift会检查在编译时实现的类是否满足协议的要求。 因此,这使开发人员甚至可以在运行程序之前找出代码中是否存在任何问题或错误。 与类相比,协议还带来了更多的抽象。 什么是面向协议的编程? POP是一种新的编程方法,可以使用协议修饰我们的类,结构或枚举。 Swift不支持多重继承,因此,当您想向类中添加多种功能时,就会弹出问题。 POP使您可以使用支持多种实现的协议向类,结构或枚举添加功能。 OOP与POP 类之间的抽象建模依赖于继承。 子类将具有其超类的能力。 子类可以覆盖该功能,并添加特定的功能。 在您需要另一个班级的另一项技能之前,OOP可以完美发挥作用。 Swift中没有多重继承。 但是协议是蓝图,而不是父级。 协议通过描述实现类型应实现的内容来对抽象进行建模。 这是OOP和POP之间的主要区别。 OOP的另外两个优点是: 类型可以符合多个协议。 这带来了完美的灵活性。 协议也可以由类,结构和枚举扩展和采用。 在下面,我将创建一个武器协议,而不是类。 您可以为var和函数创建蓝图。 在协议中创建var可以使您的类通过强制定义该变量来使该协议符合该协议。 在此示例中,我们强制开发人员在使用Weapon协议时将名称,canFire和canCut vars添加到武器 协议武器{ var名称:字符串{get} var canFire:Bool {get} var canCut:布尔{get} } 现在,考虑一下我们有两种武器: 易燃,可切割。 我们将通过武器协议使用这些功能来创建所需的武器。 协议可燃{ var magazineSize:Int {get} }协议可剪切{ var重量:双倍{get} var steel:字符串{get} } 我们创建了技能和我们的武器协议。 让我们使用所有这些来创建结构。 […]

Swift中OOP的基本概念以及如何实现它们

对于每种面向对象的语言,三个概念都很突出:封装,继承和多态。 这些概念是编程语言的通用概念,但与面向对象编程紧密相关。 我决定探索Swift / Objective-C中的概念,并在C中实现它们。 某些概念在编程语言中具有不同的形式。 对于每个概念,我都会简要介绍这些概念。 C 如果您是C程序员,则可以跳过此部分。 但是您从来没有碰过C代码或感到有些生锈,这是示例中使用的语言构造的快速入门。 C有两个文件: .h —头文件,包含函数和数据声明,由客户端代码包含; .c-源代码,实现。 我们将使用指针。 指针是对内存中位置的类型化引用。 指针在类型后使用星号声明。 int *指针; 我们可以创建一个指向内存中任何内容的指针。 C中没有类,但是我们有结构。 struct Foo { 国际会员 }; 结构只能包含数据,不能包含功能。 但是我们有指向函数的指针。 struct Foo { 国际会员 无效(*功能)(无效); }; 如果您在Objective-C中使用了块,则看起来很熟悉。 C需要在使用前声明。 struct Foo; 虚函数(void); 为了方便起见,我们可以为类型创建别名。 typedef struct Foo * FooRef; // FooRef现在是Foo的指针 FooRef foo; 我们可以使用点表示法访问结构的成员。 访问指针值称为解引用。 对于结构的成员,我们可以使用->运算符。 *指针= 123; foo-> […]

Swift中的面向对象编程

苹果公司的大多数框架都具有面向对象的体系结构。 在开始研究iOS / MacOS开发之前,您应该首先了解面向对象的编程和设计模式。 在本文中,我们将介绍基本概念和设计模式,以帮助您开始进行应用程序开发。 总览 面向对象编程(OOP)是一种编程范式,代表了具有数据字段(描述对象的属性)和相关方法(称为方法)的“对象”的概念。 对象通常是类的实例,用于彼此交互以设计应用程序和计算机程序。 面向对象编程包含3个关键方面: 封装意味着对象将其状态信息保密。 其他对象不是直接处理对象的数据,而是以消息的形式向对象发送请求,对象可能通过更改其内部状态来响应其中的一些请求。 多态性意味着不同类别的对象可以互换使用。 这一点特别重要,因为它允许您以后以不必要的方式挂钩类,而不必事先预料这些类是何时设计的。 继承意味着一类的对象可以从另一类(基类或父类)派生其行为的一部分。 某些面向对象的语言(例如,C ++,但不支持Swift)允许多重继承,其中一类对象可以从多个独立的基类派生其部分或全部行为。 类和对象 在面向对象的编程中,类是用于创建对象,提供状态(成员变量)和行为实现(成员函数,方法)的初始值的可扩展程序代码模板。 换句话说,类就像一个蓝图,它定义了类型的数据和行为。 类按钮{ } 上面的定义创建一个名为Button的空类。 它唯一能做的就是创建新的Button对象: var button = Button() 在上面的示例中, button是Button类的实例。 物产 类和实例可以具有名为属性的关联值。 广场广场{ var length :Int = 1 } Square类的length属性的默认值为1 。 为了创建length不同于1正方形,我们需要编写一个自定义初始化程序。 广场广场{ var length :Int = 1 初始化 ( 长度 :整数){ self.length =长度 } } […]