Tag: Swift 4

Xcode Playgrounds中的Swift ARC实验

并介绍自动释放池 ARC代表自动引用计数,Swift将其用于动态内存管理。 我正在遍历《 Swift编程语言(Swift 4) 》中的 “自动引用计数”一章,试图在遇到某些矛盾时涵盖所有角度。 至少那是我的第一个想法。 “自动引用计数”一章描述了强大的引用循环,展示了几种可能导致潜在引用的情况,最后,它针对给定情况提出了使用语言构造来避免它们的方法。 在本文中,“ 对象 ”一词用于指代类实例 ,因为“引用计数仅适用于类实例。 结构和枚举是值类型,而不是引用类型,并且不通过引用存储和传递。” 方案1: 对象通过属性相互引用,这两个属性都可以为“ nil` 它建议使用弱引用,以便在删除强引用时,将使用weak关键字声明的属性设置为nil 。 基类: 类人{ 命名:字符串 init(name:String){ 打印(“ \(名称)-开始初始化”) self.name =名称 } var apartment:公寓? deinit {print(“ \(name)正在被初始化”)} } 公寓类{ let单位:字符串 init(单位:字符串){ print(“ \(unit)-开始初始化”) self.unit =单位 } 弱var租户:人? deinit {print(“公寓\(单元)正在被初始化”)} } 创建变量和强引用: //注意可选的类型声明! var john:人吗? var unit4A:公寓? john = Person(姓名:“ […]

轻松注册和维护UITableViewCell

我同意,在大多数情况下,一种班轮代码并不适用,但是对于喜欢的班轮代码,这是其中一种。 因此,传统的方法是首先要求您创建UINib对象并加载它,然后在表视图中注册它。 简而言之 let nib = UINib(nibName:“ nameOfYourNibFile”,包:nil) tableView.register(注册:nib,forCellReuseIdentifier:“ yourIdentifier”) 现在,如果您有多种类型的细胞,它很容易长大。 您对此的看法: 没有更多的字符串操作和记忆笔尖的名称,也没有单元重用标识符。 另外,如果您添加任何新单元,则它们会自动注册。 所以,走吧… 您将需要创建一个简单的协议,使其符合CaseIterable (它是type,它提供了所有值的集合,有关它的更多信息),这使我们可以轻松访问allValues 。 我们的协议应包含AnyClass类型的简单属性(重新设置UITableViewCell或CollectionViewCell)。 总而言之 因此,让我们考虑一下您要加载多个单元格类型的主屏幕。 让我们创建符合先前创建的协议的枚举。 现在,最后一步是通过创建扩展来扩展UITableView的功能。 稍作修改的老派方式😊 没有看起来那么复杂。 我希望我能得到那些一线讨厌者。 如果喜欢的话,别忘了给掌声,会感激的。 快乐编码

可视化的快速访问控制

Swift是类似于我的第五十种编程语言的东西,而且我倾向于仅仅洗刷访问控制之类的东西,通常我会摆脱它。 我必须非常喜欢一种语言来关注访问控制的各个方面,这是值得的。 在两种情况下对于Swift都是如此。 真实的故事:我每年都会去巴塞尔艺术展。 在Swift的第一年,我正忙于坐在林肯路(Lincoln Road)上的星巴克(Starbucks),忙于通过Swift 1.2手册去参加艺术展或聚会。 无论如何:花一些额外的时间思考一下Swift中的每种访问控制情况是值得的,因为细微的差异和特殊的含义会惯常地出现。 (到底什么是公共私有集,为什么需要它?)。 我遵循了Swift手册来关联这些图。 如果您在手册中查找它们,则会以与Swift 4手册中相同的顺序在此处看到条目。 目的是帮助您可视化差异,而不是最终替代手册。 随时提出修改建议。 这是本周正在进行的工作,可能需要更长的时间。 在“ Public Private(set)”成语中需要更多信息。

播放歌曲列表并无限循环

在此家庭教师中,您将播放mp3歌曲列表并无限循环。 在开始之前,您可以在此处下载完整的源代码项目,而不带歌曲,以防万一您停在任何地方。 要播放歌曲列表,可以使用AVQueuePlayer,但它不支持循环,并且将循环功能添加到其中很复杂。 因此,我们将不使用它,而是手动进行。 我们将执行的步骤: 创建一个歌曲包。 从捆绑中加载歌曲并将其转换为AVPlayerItem 。 播放第一首歌。 播放下一首歌。 修复错误:第一次播放后,第一首歌曲无法再次播放。 1.创建一个歌曲包 首先,您需要创建一个包含歌曲的捆绑包。 创建捆绑包可帮助您将捆绑包中的所有文件都不需要知道它们的名称。 如果您不了解Bundle,请阅读以下文章: 束 存储在磁盘上捆绑目录中的代码和资源的表示。 请参阅以下步骤以了解如何创建捆绑包: 在项目文件夹中创建一个扩展名为.bundle的新文件夹(例如: Songs.bundle )。 将声音文件复制到该新文件夹中。 将该新文件夹拖动到在Xcode中打开的项目中。 通过使用Bundle类的urls(forResourcesWithExtension:subdirectory:)方法检索URL 您可以观看我制作的该视频,以防无法创建。 2.从捆绑中加载歌曲并将其转换为AVPlayerItems 为了能够播放歌曲,您需要加载声音文件并将其转换为AVPlayerItems,以便AVPlayer可以播放它。 如果您不了解AVPlayerItem,请阅读以下文章: AVPlayerItem 用于模拟玩家所玩资产的时间和呈现状态的对象。 将以下代码片段添加到您的视图控制器中,然后从viewDidLoad()方法调用它: 运行该应用程序并查看日志以查看文件名已加载。 3.播放第一首歌 要播放歌曲,您需要使用AVPlayer类。 如果您不了解,请阅读以下文章: AVPlayer 提供界面以控制玩家的运输行为的对象。 将以下代码片段添加到您的视图控制器中以播放歌曲: 现在运行该应用程序,您将听到声音已经发出🙂 播放下一首歌 第一首歌曲播放完毕后,播放器将不会继续播放下一首歌曲。 所以我们会做。 首先,您需要在播放器项目结束播放时注册通知。 您将loadSongListIntoPlayerItems()方法更新如下: 添加用于接收通知的方法,并使用replaceCurrentItem(with:)方法播放下一首歌曲: 运行该应用程序,您将看到该应用程序可以播放下一首歌曲。 那很棒。 但是在播放完最后一首歌曲并再次播放第一首歌曲之后,就没有声音发出了。 这是为什么? 请查看下一个指南。 修复错误:首次播放后,第一首歌曲无法再次播放。 B / c AVPlayerItem是一个动态对象,它存储其当前播放位置。 […]

UIViewPropertyAnimator简介– Hairui lin –中

UIViewPropertyAnimator简介 设定 我们首先创建一个蓝色垂直于中心并水平指向主视图的视图。 向后拖动框 现在,如果动画停止播放后,我们希望将蓝色框拖回其原始位置,然后执行反向动画,该怎么办? 这是pauseOnCompletion派上用场的地方。 通常,当动画到达其.end位置时,将执行完成块,动画师将移回。 处于非活动状态,然后将动画块从系统堆栈中删除。 您可以查看有关UIViewPropertyAnimator可能状态的苹果文档:https://developer.apple.com/documentation/uikit/uiviewanimating 但是,因为我们将pauseOnCompletion设置为true,所以动画师不会移动到。 处于非活动状态,动画不会从系统堆栈中删除。 相反,动画师停留在。 处于活动状态并保留动画块(这意味着我们可以继续使用之前在setupAnimation()函数中添加到动画器的动画块)。 注意:动画制作者执行动画时,位于中。 活动状态,其isRunning属性为true 。 如果动画制作者的动画已暂停,则它仍在中。 活动状态,但其isRunning属性为false 。 因此,如果要在将pauseOnCompletion设置为true时观察动画是否已“完成”,则需要观察动画师的isRunning属性,该属性需要KVO机制。 在setupAnimation()中添加以下行,以观察动画制作者的isRunning属性。 //添加观察者以观察动画师是否已暂停 animator.addObserver(自己,forKeyPath:#keyPath(UIViewPropertyAnimator.isRunning),选项:[。new],上下文:nil) 并且,在ViewController中,我们重写了watchValue函数 实现可中断 最终结果将如下所示。 我们希望实现动画的可中断功能,以便可以在动画过程中将其停止并从原处重新开始。 添加点击手势 我们向蓝框添加了轻击手势,因此,每当您点击蓝框时,动画都将暂停。 我们还需要在ViewController中修改observeValue函数,因为现在如果动画已暂停,则它可以指示动画已结束或已被中断。 仅当且仅当动画已达到其结束时,我们才希望反转动画。 修改平移手势 当panGesture开始时,我们要确保动画是否正在运行,是否已暂停。 在某些情况下,如果用户通过平移动画蓝框而不是点击动画蓝框开始,则不会触发点击手势识别器。 这就对了! 希望本文可以帮助您更清楚地了解UIViewPropertyAnimator的基础。 您可以从https://github.com/hairui19/UIViewPropertyAnimatorExample从github下载代码

如何轻松地在Xcode中更改文件标题文本

您是否曾经想过在每次创建自己的文件时自动创建自己的标题文本? Xcode帮助页面已经说明了如何执行此操作。 但是对于新程序员来说,那里的信息太多了。 因此,如果您感到困惑,请遵循此简单教程! 你需要什么 我们需要两件事: 具有以下名称的plist文件: IDETemplateMacros.plist。 我们将创建这个。 将文件放在上方的位置。 创建plist文件 打开Xcode。 创建新文件,快捷方式为Command +N。 向下滚动到资源文件,然后选择属性列表类型文件。 单击“下一步”,并提供文件名IDETemplateMacros.plist。 现在将其保存在桌面上,以便我们轻松找到它。 稍后我们将把这个文件移到适当的位置。 自定义文本宏 创建plist文件后,就可以修改plist文件并为标题文本添加宏键。 双击打开您创建的plist文件。 我更喜欢使用Xcode作为plist编辑器。 突出显示根行,然后单击+号。 键入FILEHEADER作为键名,并确保类型为String。 FILEHEADER是一个文本宏,它引用放置在Xcode中每个新文件顶部的文本。 如果您想更多地了解其他宏,Xcode帮助将列出所有宏。 这是有趣的部分,在文本编辑器中创建自定义标题文本。 我已经使用TextEdit制作了自己的自定义标头,如下所示,您可以编写任何内容,并使其随心所欲: 恭喜你! 您已经制作了自己的标题文本,可以使用了。 选择放置plist文件的位置 现在,我们需要将此文件放到Xcode读取宏的地方。 Xcode将在以下位置查找文本宏: 项目用户数据: .xcodeproj / xcuserdata / [用户名] .xcuserdatad / 项目共享数据: .xcodeproj / xcshareddata / IDETemplateMacros.plist 工作区用户数据: .xcworkspace / xcuserdata / [用户名] .xcuserdatad / […]

Swift:API和JSONDecoder

API网址(随机用户):https://randomuser.me/api 右图网址上的API没有这么整齐,您可以去这:http://jsonprettyprint.com/帮助您整理。 上图显示API,接下来只需要把需要的数据模仿下来下载解析,API本身就是个数组,别忘记。 从网址上下载资料下来解析,这边就使用JSONDecoder。 在解析资料这部分,照片解析下来还是Data,所以要下载成UIImage就需要额外制作下载Photo的方法。

Swiftの复数行Stringリテラルまとめ

\ nをやらなくてもよい 今更ながらSwiftの复数行Stringリテラルをを知ってわりと喜ばしいので,ここにまとめる。 Swiftのバージョンは4.2 基本 3つのダブルクオテーションで次ように囲む。 让sampleString =“”“ あいうえおかきくけこさしすせそ “” 来の方式で表した次のものと同等である。 “あいうえお\ nかきくけこ\ nさしすせそ” すべースコード上の改行が生成物に残る。注意すべきことは「あ」の前と「そ」の后に\nがないこと。 単独の”の扱い ひとつの”を终わりの记号と见なさないので,自由に”を含めることが出来る。 let quotation =“”“ 白兔戴上眼镜。 “我从哪里开始, 请your下?”他问。 国王严肃地说:“从头开始,继续 直到你走到尽头 然后停下来。” “” 3つの“の扱い “を3つ连続したいときは,\を用いて,裸の”が3つ并ぶのを回避する。 让threeDoubleQuotationMarks =“”“ はじめのひとつをエスケープ\“”“ 3つ全部をエスケープ\“ \” \“ “” 生成したものの中身は はじめのひとつをエスケープ“”“ \ n3つ全部をエスケープ”“” 改行コードを入れない 特定の行に改行コードを入れないことが出来る。\を用いる。 让sampleString =“”“ あいうえおかきくけこ\ さしすせそ “” これは次と同等 “あいうえお\ nかきくけこさしすせそ” 始めと终わりに改行コードを入れる 始めと终わりに改行コードをいれるには空の行を追加すればよい。 让sampleString =“”“ あいうえおかきくけこさしすせそ […]

创建一个不使用情节提要的新iOS项目

故事板很棒,它们绝对有目的,并且使快速构建iOS应用程序变得容易。 也就是说,我发现在较大的应用程序上,它们会出现许多问题。 主要是它们很难进行版本控制,并且可能变得庞大。 我敢肯定那里有克服这些问题的团队,但对我个人而言,不使用它们会更容易。 大多数长期应用似乎都使用了直接编写的代码,或者混合了nib / xib文件和代码。 无论出于何种原因,Apple不再提供非故事板单页应用程序,这意味着我们需要做一些事情来创建一个。 我发现摆脱它们,创建一个nav或tab控制器并将其用作我的根源更加自由,而不必再考虑segues了。 无论如何,我们看到的所有奇特的东西都可以通过自定义转换来完成。 还有人在开发周期的后期决定,他们希望VC转移到应用程序中完全不同的位置,从而减少了纠缠。 无论哪种方式,您都会遇到一个应用程序,无论出于何种原因,其中一项要求是该应用程序不能使用情节提要,因此最好知道如何创建该应用程序。 这也是我们在情节提要之前制作应用程序的方式,并且总是有机会最终导致不使用它们的旧项目。 步骤1.创建一个新项目 打开xcode并创建一个新的Single View App,将其命名为任意名称。 出于本教程的目的,我将其命名为测试,不包括任何测试。 当我们打开它时,我们将有一个Main.storyboard和一个ViewController.swift文件。 2.删除情节提要 选择ViewController.swift和Main.storyboard并将其删除。 选择将它们移到垃圾桶 接下来,我们需要通过从我们的info.plist中删除主故事板,让该应用知道不使用主故事板。 打开您的Info.plist,然后单击“主故事板文件库名称”旁边的减号按钮。 步骤3.创建一个新的主ViewController,以在应用启动时使用 创建一个名为MainVC的新文件 这是UIViewController的子类。 单击“ Also create XIB file旁边的检查。 出于本教程的目的,我们将使用xib文件,但是也没有理由。 创建它之后,打开AppDelegate.swift 。 在didFinishLaunchingWithOptions我们需要让应用知道在启动时使用我们的MainVC 。 添加以下代码: self.window = UIWindow(框架:UIScreen.main.bounds) self.window?.rootViewController = MainVC(nibName:“ MainVC”,包:nil) self.window?.makeKeyAndVisible() 就是这样,构建并运行您的应用程序,您应该看到MainVC 。 您现在没有情节提要了。

使用地图解开Swift Optionals

阅读优秀程序员编写的源代码是改进我们编码方式的最简单方法。 我一直很欣赏objc.io上的人编写的代码。 有一天,我读了约翰·桑德尔(John Sundell)的一篇关于Swift中的期货和承诺的文章。 由于具有可选功能,在阅读该文章时我还不了解,因此理解起来并不容易。 Futures and Promises本身是一个复杂的概念,但是我在一些代码片段中发现的是一种不常见的方法来解开optionals 。 本文还可以帮助理解John Sundell编写的代码。 我们通常使用if let或guard let 解开可选内容的语法。 通常用于解开可选字符串( 或任何其他类型的optional )的代码如下 现在让我们讨论解开可选内容的不常见方式。 我们可以使用map函数来展开可选对象。 你不惊讶吗? 好吧,我是。 我一直以为map应该与Sequences一起使用。 现在这个想法已经改变。 根据Apple的文档,关于可选方法的map方法的描述如下 当此Optional实例不为nil ,计算给定的闭包,将未包装的值作为参数传递。 这意味着如果一个可选参数具有某个值 ,将执行给map函数的闭包 。 特别是闭包将收到解包的可选参数。 因此,我们可以使用下面的代码使用map函数来展开可选字符串。 现在,如果您尝试阅读有关Swift中的期货和承诺的文章,您将更好地理解它。 现在,我们知道了另一种安全地包装可选内容的方法,这是我们可以用来提高代码可读性的方法。 你喜欢这篇文章吗? 也许尝试以下方法之一: 在Swift中使用ExpressibleByArrayLiteral简化生活 驯服宽松的通知 断点作为调试内容提供者 在核心数据中使用可变类型作为可转换属性的危险