Tag: Swift游乐场

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 […]

Swift 4 Introduction系列1.5 — Swift数据类型元组

通过将2个或多个基本数据类型分组为单个复合数据类型来形成元组。 元组的每个元素可以是任何Swift基本数据类型。 元组中的每个元素之间的数据类型可以不同。 由于元组可以包含许多不同的类型,因此我们可以从任何类型的排列中创建元组。 元组不适合复杂和持久的数据结构。 对于复杂而持久的数据结构,我们应该使用结构或对象类。 要创建一个常量元组,我们使用相同的关键字let,然后使用关键字var来创建变量元组。 常量和变量的行为与Swift基本数据类型相同。 常量是不可变的,变量是可变的。 我们可以用字符串和整数组成一个元组,如下所示: 让contact =(“我的名字”,22341176) 要访问元组中的元素,我们使用从0开始的索引。 例: 0 接触1 像往常一样,我们也可以通过先声明一个元组来创建一个元组。 我们只需要将所有不同的数据类型放在方括号中即可,并用逗号将它们分开。 例: 让address1 :(字符串,字符串) address1.0 =“ A座公寓” address1.1 =“新泽西州” 地址1.0 地址1.1 请注意,尽管我们可以先声明常量而不分配数据。 这不是最佳实践。 为了声明常量,我们应该在同一条语句中声明并分配它们。 这是为了使我们的代码更安全。 我们只应声明元组,然后在绝对必要时分配数据。 对于变量,即使我们没有要输入的数据,也应首先声明和初始化变量。 创建元组变量的首选方法是使用以下方法同时创建和初始化变量。 var contact1 =(String(),Int()) contact1.0 contact1.1 contact1.0 =“这是一个测试” contact1.1 = 2132 contact1.0 contact1.1 contact1.0 =“大卫” contact1.1 = 76788779 contact1.0 contact1.1 对于元组中的每个元素,我们可以具有相同的数据类型。 […]

在Swift-4中玩闭包(Part -2)

大家好 !! 在上一篇文章中,我们都讨论了Swift中的一些基本闭包。如果您尚未对其进行检查,请进行检查。在本教程中,我们将讨论更多内容。 Swift会自动为内联闭包提供简写参数名称,可用于通过名称$ 0,$ 1,$ 2等来引用闭包参数的值。 速记参数名称 正如我们上面讨论的,Swift 4通过表示$ 0,$ 1,$ 2-$ n来方便用户将内联闭包表示为速记参数名。通过在闭包表达式中使用此速记参数名,我们可以从其定义中省略闭包的参数列表。 in 关键字 由于闭包表达式完全由其主体组成,因此可以省略。请看以下示例。 因此,在第一个示例中创建了一个闭包,该闭包采用单个参数并返回字符串。此处$ 0表示第一个参数。类似地,在第二个示例中,闭包采用两个参数,通过使用$ 1,我们引用了第二个参数。关闭 自动关闭 我们知道闭包可以用作函数中的参数。当我们编写@autoclosure时 ,参数会自动包裹在闭包中。但是,如果我们创建一个具有@autoclosure的函数,则存在一个问题,通常调用该函数具有自动关闭功能的函数,但是实现这种功能并不常见。 让我们举一个小例子。 func simpleFunctionwithoutAutoclosure(_ parameters:()-> Void){ 打印(“嘿,我们刚刚创建了一个没有@autoclosure属性的函数”) 参数() } simpleFunctionwithoutAutoclosure({ 打印(“ hello”) }) func simpleFunctionwithAutoclosure(_参数:@autoclosure()->无效){ 打印(“嘿,我们刚刚创建了一个具有@autoclosure属性的函数”) 参数() } simpleFunctionwithAutoclosure(print(“ hii”)) 并且输出如下 从上面的两个函数中,我们注意到,在@autoclosure的情况下,无需将表达式用大括号括起来。 如果要传递闭包而不是自动闭包,这就是我们需要做的。 逃逸关闭 当闭包作为函数的参数传递给闭包时,闭包被认为是对函数的转义,但是在函数返回后会被调用。 声明将闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping,以指示允许对闭包进行转义。 Apple的文档给出了一个示例,该示例将传递给函数的闭包附加到您的类/结构中可变的闭包数组中: varcompleteHandlers:[()->无效] = [] func someFunctionWithEscapingClosure(completionHandler:@escaping()-> Void){ […]

峰值和稳定仅在以下情况下有效:

如果您正在练习敏捷,您可能知道峰值 。 这是一个有时间限制的代码实验,目标​​是学习。 丹·诺斯(Dan North)提出了一个新的概念,称为“ 峰值和稳定”。 这是一种高纪律模式,目的是通过不花时间在不重要的功能上进行测试,重构和设计,从而快速创造价值。 我们的想法始终是从一个高峰开始,我们将向用户学习,并承诺以后例如使用测试驱动开发 (TDD)来稳定它。 它可以帮助团队将重点放在对客户重要的问题上,并且如果代码没有带来任何价值,也可以避免丢掉代码。 我发现这种方法非常有效,另一方面,我对将凌乱的代码创建到生产代码中并在以后使其稳定的想法感到不满意。 我是Robert C Martin如何描述专业开发人员的忠实拥护者: 专业开发人员切勿推动任何未经测试的代码生产线。 -罗伯特·C·马丁(鲍勃叔叔) 我认为只有将尖峰与生产代码隔离开,S pike和Stabilize才能起作用。 当需要稳定它时,使用TDD,SOLID原理并对其进行清理很容易将实际代码移入生产环境。 在iOS开发中,使用Swift Playground可以很容易地将尖峰与生产代码隔离开。 苹果在博客文章中将其描述为: 交互式游乐场可以帮助您快速原型化和构建应用程序,并提供另一种与代码交互的好方法。 通过与生产代码隔离的原型来探索新功能,使开发人员可以从可行的投资中寻求可行的回报 。 肯特·贝克(Kent Beck)在他的3X概念中对此进行了描述: 冒险寻求可行投资的可行回报。 成功的勘探是无法预测的,因此最高的期望值策略是降低实验成本,并为许多不相关的实验投入少量资金。 如果您幸运的话,这些实验之一证明是出乎意料的成功 最后,我认为所有iOS开发人员都应始终从Swift Playground页面开始,然后将代码拉成看起来像是首先经过测试驱动的形状 🤫。 丹·诺思(Dan North)在GOTO会议上谈论尖刺和稳定(15:50至27:30) 肯特·贝克(Kent Beck)谈论3X概念(始于20:21) 布兰登·威廉姆斯在FrenchKit会议上谈论操场驱动开发 如果您认为这将有助于其他开发人员更好地开发产品,请随时发表评论和分享。

Swift Playgrounds Study:第23天

结果:『Learn to Code2』 数组 ,Island Builder。 我花了两天时间才能完成任务“ Island Builder” 。 对我来说,这是艰巨的任务。 我的解决方案在这里💁 让allCoordinates = world.allPossibleCoordinates //创建两个[Coordinate]类型的空数组。 var岛:[坐标] = [] var sea:[坐标] = [] 用于所有坐标{ 如果坐标列 3 &&坐标行 3 { //附加到孤岛数组。 island.append(坐标) 如果coordinate.column 3 || ordinate.row 3 { //附加到海数组。 sea.append(坐标) } } //对于岛阵列,放置块。 用于岛屿{ world.place(Block(),at:坐标) } //对于您的海浪,放置水。 用于海上{ world.removeItems(at:坐标) world.place(Water(),at:坐标) } 实际上,我放弃了解决任务。 但是,在此任务中我们看不到提供的解决方案。 所以我只需要继续工作。 数组区域很难。

迅捷金属乐

适用于iOS和macOS的超快速着色器和管线探索 在过去的几年中,与许多开发人员一样,在Swift Playgrounds中工作时,我对编辑/编译/运行周期的速度不满意。 Swift Playgrounds让我们有机会轻松编写快速代码以测试概念,而无需构建完整的应用程序,部署到设备或模拟器以及观察结果。 我已使用Swift Playgrounds更好地了解了许多技术,包括: 斯威夫特语言概念 核心动画 SpriteKit 场景套件 一个让我难以理解的领域是在Swift Playground的Metal中工作。 Metal是Apple的底层图形系统,旨在利用自己的硬件并提供出色的性能。 我相当怀疑是否有直接在Metal中工作的实际输出-SceneKit对我来说做得很好-但我仍然感到需要挠痒痒。 因此,另一个游乐场冒险开始了。 配置游乐场 在创建用于Metal开发的游乐场时,需要将其设置为macOS游乐场。 iOS操场不符合条件,因为模拟器无法提供我们进行Metal开发所需的直接GPU访问。 我们需要导入一些框架。 为了处理我们的macOS视图,我们需要访问Cocoa。 我们需要Metal才能与Metal合作。 最后,我们需要PlaygroundSupport才能显示Metal视图。

Swift Playgrounds Study:第24天

结果:『学习代码2』 数组 ,附加删除的值并修复数组超出范围的错误。 这些任务令我激动。 当我解决该问题时,我感觉很好。 这是我“附加删除的值”的溶剂 //在第2行中创建一个包含所有坐标的数组。 //创建一个空的坐标数组。 让allCoordinates = world.allPossibleCoordinates //创建两个[Coordinate]类型的空数组。 var row2 = world.row(2) var testArray:[坐标] = [] 因为我在1…12 { 对于第2行中的坐标{ world.place(Block(),at:坐标) } //删除坐标并将其附加到您的空数组中。 testArray.append(row2.remove(at:0)) } //为添加到空数组中的每个坐标放置一个字符。 用于testArray { world.place(Character(),朝着:向南,在:坐标处) } “修复阵列超出范围的错误”是焦点调试。

在操场上学习认知服务

就像你们大多数人一样,自从我上学初期就喜欢编码。 那时我还不知道在计算机屏幕上移动海龟*并用它绘制东西实际上是在编码。 但这是! 随着时间的流逝,关于我们的编码方式,必须处理的复杂性级别以及最重要的事情,很多事情都发生了变化和改进:最重要的事情是:我们如何学习编码以及如何教别人这样做。 作为技术传播者,我必须紧跟技术潮流,学习新事物,以便能够与现有技术人员分享这些技术–是的,要教他们这些新技术。 因此,学与教是我日常工作中非常基本的原则。 我个人一直在寻找方法,工具和方法来更有效地完成这项工作。 由于我们能够为计算机创建内容,应用程序和功能,因此我们可以随身携带,我对应用程序编码着迷。 在2008年发布第一个SDK时,我的工作重点几乎一直局限于iOS平台。 用简单的工具创建令人敬畏的东西。 对于像我这样总是寻求摆脱复杂性的人们来说,这是一件令人愉快的事情! 🙂 因此,我们谈到了学习,教学和编码平台。 这与操场上的认知服务有什么关系? 今年夏天,iOS在iPad上增加了一个名为“ Swift Playgrounds”的应用程序。 使用此应用程序,用户可以直接在iPad上使用所有iOS板载工具在Swift中进行编码。 作为开发人员,我们可以为此Swift Playgrounds应用生成内容,以教他们如何编码和使用某些技术。 这就是我想到的想法,即为“ Swift Playgrounds”应用程序创建内容,以教人们如何使用认知服务。 直接在iPad上,您无需编写任何代码即可开始使用Vision API(计算机视觉,情感和面部),而作为开发人员,您可以深入了解并探索如何使用API在自己的应用中 作为初稿,我创建了一个运动场和一个运动场书(为您提供了更多的编辑自由,但又增加了复杂性),以使您初步了解CognitveServices的工作方式以及在自己的应用程序中使用它们的难易程度。 可以在我的GitHub存储库中找到所有与代码相关的内容-与我的slidedeck并排放置。 https://github.com/codePrincess/playgrounds 这样,对于使用新技术“玩弄”以学习如何使用的反馈非常好。 我最近在两个事件中谈到了这个问题,希望还会有更多事件🙂 SwiftConf在科隆 https://swiftconf.com/ https://www.youtube.com/watch?v=O5u3hVu3R7c 慕尼黑TechFest Hackathon http://www.techfestmunich.com/ 因此,随时可以进入游乐场! 我很高兴听到您对此有什么印象和经历🙂 继续编码! *对于那些至今未遇见“乌龟”的人,https://en.wikipedia.org/wiki/Turtle_graphic

Swift Playgrounds Study:第19天

结果:『学习编码2』 世界构建 ,构建循环和自己的难题。 最后,我完成了世界建筑区。 只剩下一个区域! 这是我的任务“构建循环”的解决方案代码。 让character = Character() var gemCounter = 0 bluePortal.isActive =否 yellowPortal.isActive =否 greenPortal.isActive =否 world.place(字符,朝向:向南,在列:7,行:3) world.place(Block(),atColumn:1,行:3) world.place(Block(),atColumn:1,行:0) world.place(Block(),atColumn:0,row:2) world.place(Block(),atColumn:3,row:3) world.place(Block(),atColumn:6,行:3) world.place(Block(),atColumn:6,行:0) 而totalGems!= gemCounter { 如果character.isOnGem { character.collectGem() gemCounter = gemCounter + 1 } 如果character.isBlocked { character.turnRight() } character.moveForward() } ^您可以在Medium中使用代码块:Cmd(Ctrl)-Alt-6 最后的任务“自己的难题”似乎就像是Minecraft。

Swift Playgrounds Study:第7天

结果 :『Learn to Code1』 While循环 ,创建更智能的While循环→ 算法向右滚动,向左滚动 最后,我完成了『Learn to Code1』! 在今天的学习中,我学到了很多东西,并注意到了很多。 特别是,我了解代码非常强大。 例如,此代码令人印象深刻。 func navigationAroundWall(){ 如果isBlockedRight { moveForward() }其他{ 右转() moveForward() } } ^您可以在Medium中使用代码块:Cmd(Ctrl)-Alt-6 以下代码是我为最最终任务“ 算法向右滚动,向左滚动”的解决方案。 我知道,这不是好的代码和无限循环。 但是我解决了任务。 不知道为什么 当然,我必须对其进行调整。 func navigationAroundWall(){ 如果isBlockedRight { moveForward() }其他{ 右转() moveForward() } 如果isBlocked && isBlockedRight { 转左() } } 而!isOnGem { 而!isOnGem和&!isOnClosedSwitch { navigationAroundWall()} 如果isOnGem { collectGem() } […]