Tag: Swift游乐场

UIDynamics在Playground的基础

总览 UIDynamics是由Apple创建的引擎,可根据定义的行为修改符合UIDynamicItem协议的类的实例的中心 , 变换和界限 。 UIView和UICollectionViewLayoutAttributes默认情况下符合UIDynamicItem协议。 在本文中,我们将重点介绍UIViews。 我可以在我的Github帐户中找到完整的Playground。 我完全建议下载并使用它,以查看每种行为的工作原理。 其中一个示例的示例: 搭建游乐场 在研究本文时,我发现Playground是实现和完善UIDynamic行为的非常有用的工具,因为它真的很容易设置并且非常快地从更改中获取反馈。 要创建一个具有以下视图的游乐场: UICollisionBehaviour 它模拟元素之间的物理碰撞。 有两种类型: 元素之间:添加多个项目。 反对障碍:通过添加边界或将参考视图用作边界。 但是自从iOS 9以来,Apple为此行为添加了新方法,从而提供了非常有趣的附加元素方法。 让我们看一下它们: 滑动附件:此附件在两个元素之间创建附件,第一个元素可以在与第二个元素相关的axisOfTranslation定义的假想轴中移动。 试图脱离该假想线将导致该轴的参考元素旋转。 限制附件:这就像将绳索绑在两个元素上一样,因此当锚点之间的距离大于length参数时,它将拖动第二个视图。 它不会影响变换或边界,这意味着元素不会旋转。 固定附件:行为就像将一根棍子绑在两个元素上一样,因此元素之间的相对位置不会改变。 销钉附件:模拟两个钉在一起的物体。 常见错误 这些是我在研究中发现的最常见错误,希望处于相同情况的人可以通过阅读以下内容节省时间: 尝试手动修改中心,边界或变换。 例如,添加手势以移动视图以更改其中心将不起作用。 它会与UIDynamics引擎发生冲突,并且不会应用物理行为。 为了解决这个问题,您可以将UIAttachmentBehavior与anchorPoint一起使用,作为用户点击的位置。 将UIDynamics + Auto Layout结合起来时,我并没有遇到大问题,当我删除附件行为并添加推入行为时,这只是一种疏远行为。 它没有从同一角度流畅地推动视图,而是重设了位置。 解决方案是在删除附件之一之前添加推送行为。 结论 UIDynamics是一个出色的工具,可以明智地使用它,可以为您的应用程序增加很多价值,或者只是从中获得乐趣。 与Playgrounds结合使用,可以非常轻松快捷地为新行为建模。 Apple的有关此主题的文档和文章并不十分深入,因此您必须猜测一些参数范围。 例如,其中一些甚至没有像UIAttachmentBehavior的FrictionTorque这样的正式单位。 为了结合一些基本行为来构建更复杂的行为,我决定写另一篇文章,解释如何构建受Swarm启发的模态行为。

Swift中的捕获列表

在进入Capture List之前,让我们谈谈关闭周期。 这是Apple文档中的定义 闭包是可以独立传递的功能块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambda。 闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。 这称为关闭这些常量和变量。 Swift为您处理捕获的所有内存管理。 这是一个关闭的例子 每当我调用increment()时,闭包都会增加数字的值 由于Closures是引用类型,因此我们可以使用类来模拟Closure,因为Classes也是引用类型。 每当我更改调用该方法时,它都会增加该存储的属性。 现在,这是一个可能导致泄漏的示例。 我将crementNumber方法更改为闭包,并作为存储的属性,输出精确给出了我想要的数字。 但这会导致内存泄漏,闭包是指对象本身,它是指self以增加数字,这将创建一个引用周期: 我们有一个对象,并且该对象具有一个存储的属性,该属性引用一个闭包。 该闭包指的是self (表示增量实例) 让我们添加deinit方法并检查它是否具有保留周期 块(Curly大括号)结束时, increment()实例应为释放内存。 捕获列表将帮助我们修复它吗? 通过添加[unowned self] 然后打印出deinit ,这意味着在闭deinit我们引用self地方,它都将是无主的,不会再强引用self ,因此不会泄漏。 但是,在使用[unowned self]时,应谨慎行事。 如果我实例化increment() ,那么我立即用三个调用increment,程序将崩溃,因为当存储的属性返回时,对象(increment实例)可以被释放,其他都没有引用它。 那么如何解决它,让我们将[unowned self]更改为[weak self] ,这意味着在访问该self的任何地方,我们都将其视为弱属性。 当存储的属性返回时,如果对象被释放,则平均值为nil,则数字将不会增加。 如果self为零,此代码将使其易于处理 就是这样,希望您喜欢这篇文章,感谢您的阅读,下次再见。

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 Playgrounds Study:第14天

结果:『Learn to Code2』 参数 ,放置在特定位置→双峰 最后,我完成了Parameters区域 。 我花了大约三天的时间。 这段代码是我对“ 参数”区域中最后一项任务的解决方案。 让totalGems = randomNumberOfGems var gemCounter = 0 让专家= Expert() 让character = Character() func collectJump(){ 如果character.isOnGem { character.collectGem() gemCounter = gemCounter + 1 } character.jump() } 而gemCounter!= totalGems { world.place(字符,面向:北,at列:5,行:0) 因为我在1…7 { collectJump() } world.place(字符,面向:北,at列:4,行:0) 因为我在1…7 { collectJump() } world.place(字符,面向:北,at列:3,行:0) 因为我在1…7 { collectJump() } } 希望这个周末完成《学习密码》。

Swift Playgrounds:最简单的方法

如果您曾经尝试过建造快速的游乐场,那么您会知道这项任务多么艰辛和令人讨厌。 您不知道出了什么问题,必须一直为您的ipad发送时间,或者等一千分钟直到icloud重新加载它。 如此艰难,以至于我和我的朋友们首先习惯于首先创建一个xcode项目并将所有内容放入其中。 所以,要感谢苹果的时间: 狗的日子结束了! 为什么? 看看:Swift Playgrounds作者 因此,如果您想快速使用这个出色的工具,只需保留此页面即可! 为什么? 作者模板的工作就像魔术一样:您可以构建,测试它,还可以使用运动场语言(实时视图等)调试运动场。 当它准备就绪时:它就可以建造了,您的游乐场将在iPad上完美完成,就像馅饼一样简单! 怎么样? 首先:在苹果网站上下载该项目:Swift Playgrounds Author Template 顺便说一句,我不是要教如何使用,而是要说我在使用时学到的技巧。 1)了解结构 它的结构看起来像xcode和游乐场书籍的结合。实际上就是这样! 老实说,我并没有仔细说出一切,但如果您想了解更多..可以免费在Google上搜索。 运行项目重要的是什么? a)清单-在清单中,您将在其中告知游乐场的基本信息,例如名称,页数等。 b)源代码-在源代码中,您将放置类,例如视图控制器,类…… c)私人资源-这里将包含支持文件,例如图像,情节提要,XIB,Sceneview,音频…… d)章节-如果您已经写了一本操场上的书,那么您会知道这里是文本,尽管该平台在很大程度上发挥了作用 e)章节-最后但仍然很重要的产品,您很快就会了解更多! 2)保重! 上面的图像是此运动场模型中的一个类。您一定不要忘记让重写或委托功能处于公共模式。 如果您这样做,那么构建器将抱怨并要求您将其更改为私有,但委托将无法工作。 另外,请注意,在开始时我添加了此objc行,以便让他们知道我的类在项目中的位置:另一个“您一定不能忘记”的地方! 3)在目标! 如果您从未与多个目标合作过,也许会有些困惑,但是喘口气,我知道您可以做到! 在这个项目中,您有三个不同的目标: a)游乐场书-这将是您工作的结果:游乐场书,但让我们将其保留下来以作为结局 b)书籍来源-顾名思义,这个目标是您的来源,有点令人困惑,但是当我们检查成员资格后,您会明白的 c)书本来源-有用的目标! 有了这个,我们就可以运行,调试并在游乐场中做我们想做的一切 现在您已经了解了每个项目的一点点,应该将正确的目标成员资格添加到项目的每个源中,如果您从未这样做过,那么只需选择存档并打开检查器即可: 那么每个归档文件属于哪个目标? a)来源->图书来源 b)私有资源:私有资源通常是视听内容,这意味着如果您希望将其保留在书中,然后选择PlaygroundBook成员资格,LiveView目标也会发生同样的情况,如果您不标记成员资格,则源不会可用..这就是为什么对我来说不合理的原因是不将所有内容都标记为成员身份,但这取决于您🤷‍♀️ (显然来源除外) 4)建筑和大决赛 现在,您编写了没有错误的代码,并且想要尝试看看行为是否正常。 测试就像在普通的xcode中一样:cmd + r 当然,您必须选择正确的目标:实时显示测试: 选择实时取景,然后等待其在iPad中运行! 大决赛 必须告诉真相:我写了这整件事,等待这一刻! 现在是时候让您的所有代码成为一本真正的游乐场书,并向您的小侄子展示您的惊人项目了。 但是,为什么要大结局呢? 因为它是如此简单,以至我以为是谎言。 […]

Xcode

行动1。 第二幕 硬件1。 部分2 第1幕:亚伯拉罕·纳瓦和凯伦·戈麦斯 行动3.我的应用 法案。 礼品应用程序// KarenGómez和我

功能性Swift:闭包{}

闭包是可以独立传递的功能块,可以在代码中传递和使用。 – 苹果 闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用,因此称为闭包。 您可以将闭包视为一个没有自己名称的函数,并从其环境中捕获任何值。 函数和闭包是Swift中的一流对象 :您可以存储它们,将它们作为函数的参数传递,并像对待其他任何值或对象一样对待它们。 将闭包作为完成处理程序传递是许多API中的常见模式。 标准Swift库主要将闭包用于事件处理和回调。 函数是执行特定任务的独立代码块。 您为函数指定一个名称,该名称可以标识其功能,该名称用于“调用”该函数以在需要时执行其任务。 您可以使用func关键字定义一个函数。 函数可以不带太多参数,可变参数而返回任何一个或多个参数。 函数类型由参数类型和函数的返回类型组成。 对于上面的示例,函数类型为: (Int, Int) -> Int 可以将其理解为:“具有两个参数的函数,都具有Int类型,并且都返回Int类型的值。”可以将函数类型设置为参数或函数的返回类型。 可以将函数类型分配给任何这样的变量: var mathFunction:(Int,Int)-> Int =添加 函数是闭包的特殊情况。 闭包采用以下三种形式之一: 全局函数:它们具有名称,不能捕获值。 嵌套函数:它们有一个名称,可以从其封闭函数中捕获值。 闭包表达式:它们没有名称,可以从其周围的上下文中捕获值。 可以通过将函数类型放在大括号内并in返回类型后in关键字中来创建闭包。 单表达式闭包可以通过从声明中省略return关键字来隐式返回其单表达式的结果。 对于多行表达式闭包,不能省略return关键字。 如果由于函数的最后一个参数而需要将闭包表达式传递给函数并且闭包表达式太长,则可以将其写为尾随闭包。 在函数调用的括号()后面写一个结尾的闭包,即使它仍然是函数的参数。 使用尾随闭包语法时,不要在函数调用的过程中为闭包编写参数标签。 如果闭包是方法的最后一个参数,那么swift允许您这样编写: 使用reduce()的结尾封闭示例 尾随闭包语法的使用可以在闭包支持的功能之后立即整齐地封装闭包的功能,而无需将整个闭包包装在reduce(_:)方法的外部括号内。 闭包可以从定义它的周围上下文中捕获常量和变量。 然后,闭包可以从其主体内部引用和修改这些常量和变量的值,即使定义常量和变量的原始范围不再存在。 在Swift中,最简单的可以捕获值的闭包形式是嵌套函数,它写在另一个函数的主体内。 嵌套函数可以捕获其外部函数的任何自变量,还可以捕获在外部函数内定义的任何常量和变量。 Swift文档中给出的示例 此makeIncrementer函数接受一个参数(即Int)作为输入,并返回一个函数类型,即() -> Int 。 这意味着它将返回一个function ,而不是一个简单的值。 它返回的函数没有参数,并且每次调用都返回一个Int值。 在这里, amount是参数, runningTotal被声明为变量并初始化为0。嵌套函数incrementer runningTotal从周围的上下文中捕获amount和runningTotal […]

斯威夫特-好

今天早上,我得到了“ Tuomas Artman” Talk的链接,他是Uber的架构和框架技术负责人。 在观看Talk时,我发现了一个有趣的话题,即“什么使’Swift’变得更好?” 是的,现在你们知道我在哪里找到Title了。 谢谢,Tuomas Artman and Talk非常有帮助,请不要错过观看… 斯威夫特与一百名工程师 Tuomas Artman分享了优步重写的优缺点这是Tuomas Artman的演讲,在… www.skilled.io上发表 这只是一种更好的语言。 让我们找出为什么更好的语言。 我找到了一堆关键字,让我们一个个开始,看看有什么特别的……

降低

过滤,缩小和映射: 轻按一下即可转换收藏。 这些功能上的朋友, 您将清除的代码, 输入不可变,没有陷阱。 映射和过滤器引起了很多关注,但是我说减少是重要的一环。 或者,如果您对效率感兴趣,该怎么做:您可以使用reduce来构建地图和过滤器。 如果您只想学习一种,请选择减少。 功能朋友 Map具有对序列中的每个项目执行某些操作并收集结果的有用行为。 let words = [“hello”, “there”] let shoutyWords = words.map { $0.uppercased() } // [“HELLO”, “THERE”] map的输入是大小为n的序列,输出的大小也为n 。 接下来,使用过滤器可以确定序列中要保留(和丢弃)的项目。 let numbers = 0…10 let evenNumbers = numbers.filter { $0 % 2 == 0 } // [0, 2, 4, 6, 8, 10] 输出大小将介于0到n之间,具体取决于要过滤的事物数量。 减少什么? 减少减少 像其他两个操作一样, reduce接受一个序列作为输入,但是它的输出更为通用:它可以是您想要的任何东西! […]

探索Swift

克雷格·格鲁米特(Craig Grummitt)选择的章节 Swift不仅是Objective-C的现代替代品。 自2015年开源以来,Swift已发展成为一种功能强大,现代且富有表现力的语言。 从Web开发到服务器端开发和基于云的服务无处不在! Swift拥有丰富而深刻的技能,可以交付更干净,更快的代码。 您要做的就是找出如何使用它。 探索Swift会提取Manning的三位专家的知识,向您介绍Swift如何处理各种各样的独特问题。 此快速入门指南由iOS开发人员,Manning作者和指导者Craig Grummitt亲自挑选,可让您使用Swift来探索对象,使用枚举为数据建模以及解决图形问题,从而使您对世界上的语言有了深刻的了解数据及其他。 完成后,您将更好地了解Swift的用途,无论是构建下一个大型iOS应用,将其带到服务器上,还是编写无服务器功能! 立即下载此免费电子书 ! ___________________________________________________________________ 有关更多免费内容,请访问Manning的免费内容中心。 ___________________________________________________________________ 关于作者: 克雷格·格鲁米特 是一位成功的开发人员,讲师和导师。 ‘t Veen的Tjeerd是一位高级软件工程师和架构师,负责构建iOS应用。 David Kopec是位于佛蒙特州伯灵顿的尚普兰学院的计算机科学与创新助理教授。