Tag: swift

在Swift中使用泛型的13个理由

我决定使用电视节目“ 为什么要使用13种理由 ”撰写一篇有关仿制药的文章,以说明我们如何使用它们,希望您会喜欢! 提醒 Swift中的泛型是为项目编写“泛型”代码的一种方式:是的,但是还有什么呢? 这些通用类型可以用项目中可用的任何其他类型替换,也可以由Swift标准库提供。 它们通常用于创建结构,类或函数。 如果需要,泛型可以受协议约束 ,从而可以更精确地了解泛型。 您已经遇到的最常见的通用类型是Optional 。 您可以使用任何类型并将其设置为Optional,它将起作用。 这是因为Optional使用通用类型(在其定义中声明为Wrapped ),该通用类型允许您在其中放入任何内容。 而且,它可以有选择地帮助您编写更少 , 干净和可重用的代码! 让我们看看如何说明它们的用法。 语境 自由高中的新来学生汉娜·贝克尔 ( Hanna Becker)在未知的情况下自杀身亡。 她的朋友克莱·詹森 ( Clay Jensen)想知道她死亡的所有真相。 在她去世之前,她记录了13个原因 她用录音带传送给她的朋友托尼帕迪拉(Tony Padilla) 。 我们将尝试帮助克莱聆听录音带,并使用基本的Swift泛型原理最终认识他的朋友汉娜的真相。 不用担心,本文没有任何破坏 ! 帮助克莱·詹森 汉娜去世前,克莱曾 在他去学校的路上听音乐。 他拥有一个音乐播放器 ,该音乐播放器可以从CD和USB等多种支持中读取内容。 不幸的是,他的音乐播放器坏了。 由于我们是好人,我们将帮助他让它再次发挥作用。 我们将定义一个枚举AudioType ,它将包含不同类型的可能的支持。 我们还定义了一个名为AudioContent的协议,该协议将保存不同音频支持的属性 : 最后,真相 托尼刚把录音带交给了克莱: Tape类再次符合AudioContent协议,并且还具有title属性。 不幸的是,克莱无法用他的音乐播放器来读取磁带。 每个磁带都有不同的类型,是唯一的,并且由不同的属性组成: 这些自定义磁带是从Tape类继承的 ,因此它们也符合AudioContent协议。 请注意,它们可能还具有一些属性和方法。 克莱决定窃取能够读取任何磁带的托尼帕迪拉的磁带播放器 。 […]

RxSwift#2 —可观察的과主题(+中继)알아보기

可观的下载, 可观察的主题 ,RxCocoa 中继的继电器 。 룬룬다룬룬알아 可观察的 Observable이지속적으로이있것을发射이라고다。 1.可观察的生命周期 next 통해1,2,3을可观察 뒤뒤종료된可观察 1,2에러에러종료된 error 를종료된可观察 이전다뤘던정정해보자 next :최신(다음)값을이벤트 error :可观察到的错误 complete :성공적으로이벤트스시퀀이벤트。 可观察的이더상배출하지않음

在iOS中实现3D Touch

当用户选择快速操作时,您的应用程序将启动(如果当前未运行),否则,如果您的应用程序已启动并且处于后台/暂停状态,则您的应用程序将在应用程序委托对象收到快速操作之前被激活消息或通知。 对于任何应用程序,我们最多可以有4个快捷方式操作;如果从应用程序商店下载了第五个名为shareApp的快捷方式,则系统会添加该操作。 我们的应用程序中可以同时包含静态和动态快速操作,但是静态操作比动态操作具有更高的优先级。 因此,如果您的应用具有3个静态操作和3个动态快速操作快捷键,则只会向用户展示一个动态操作以及这3个静态操作。 →开始编码: 要添加快速操作,请在应用程序的Info.plist文件中创建UIApplicationShortcutItems的数组。 该数组的每个元素都是一个字典,其中包含一个快速动作的属性( 例如动作的标题,字幕,图标,动作的类型(快捷方式的唯一标识符) ) 。 按键说明: UIApplicationShortcutItemType:必需的字符串,用于标识您的快速操作。 字符串必须是唯一的且特定于应用程序。 一个好主意是在它的前面加上您的包ID或其他一些应用程序唯一的String。 如果您想使用应用程序包标识符,请使用类似这样的占位符,该占位符为您提供包标识符的路径。 “ $(PRODUCT_BUNDLE_IDENTIFIER)”。 因此,即使将来更改了捆绑包ID,您的应用程序快捷方式也不会生效,也不需要在其他类似位置手动更改捆绑包ID。 UIApplicationShortcutItemTitle:必需的字符串,一旦用户按下应用程序的图标,该字符串就会显示快速操作的标题。 如果您的应用程序已本地化,则可以设置Localized.string文件的String键。 向用户显示了快速操作。 UIApplicationShortcutItemSubtitle:一个可选的字符串,用于显示快速操作的字幕。 字幕也可以本地化为标题。 UIApplicationShortcutItemIconType:可选的字符串,显示由库提供的系统图标。 检查UIApplicationShortcutIcon枚举以查看所有可能的字符串键。 UIApplicationShortcutItemIconFile:可选的字符串,用于显示要从应用程序包中使用的自定义图标图像,或资产目录中图像的名称。 UIApplicationShortcutItemUserInfo:一个词典,其中包含一些您想通过快速操作传递的额外信息。 快速操作会在iOS主屏幕上显示给用户,因此在选择这些选项时,我们需要在我们的应用中进行处理。 处理它们的最佳位置是您的App-elegate类。 在此应用程序中,我为UIApplicationShortcutItemType使用了一个枚举,以避免键入错误。 每当用户在主屏幕上选择快速操作时,在应用程序的App-delegate类中,都会调用application:shortcutItem:completionHandler:方法。 此方法必须使用布尔值调用完成处理程序,这取决于快速操作的成功或失败。 在application:didFinishLaunchingWithOptions:方法中,我们将该值保存到launchShortcutItem中,以便接下来可以处理它。 下一个要调用的方法是applicationDidBecomeActive ,此方法在application:didFinishLaunchingWithOptions:之后启动:在您的应用程序首次启动期间,或者每次用户进入您的应用程序时,该应用程序仍在后台打开。 当用户选择一项快速操作时,该应用将启动或继续。 因此,将在调用performActionForShortcutItem方法之前,调用上述两个方法( application:didFinishLaunchingWithOptions:或applicationDidBecomeActive )中的任何一个。 正如我们上面所讨论的,这是通过使用true或false调用完成操作(Bool)来处理快捷方式操作的必需方法。 在下图中,我为快速操作的快捷方式标识符定义了一个枚举。 我使用此枚举类型来查找用户在handleShortcutItem方法中触发了哪些操作。 在下图中,我们定义了handelShortcutItem方法。 首先,我们检查触发的快捷方式操作的类型是否为nil。 然后得到触发类型。 使用开关盒后,将执行所需的功能。 →动态快捷方式动作:到目前为止,我们已经看到了在应用程序的info.plist文件和然后在AppDelegate类中配置的静态动作。 我们也可以实现动态动作,但是请记住仅显示了4个动作,静态动作的优先级较高。 让我们看看配置动态动作。 在上图中,我通过代码配置了动态操作。 首先,我设置了类型,记住它必须是唯一的并且是必需的,就像在我以应用程序的包标识符作为前缀分配类型之前一样。 然后,我通过API初始化了快捷方式项。 在这一章中,您可以根据需要动态地提供标题和副标题(以及图标)。 最后,我将创建的项目分配给UIApplication的shortcutItems数组。 您可以在需要的地方调用上面的代码段,该代码段已包装在函数中。 […]

在iOS App中使用核心数据背景上下文获取远程数据

核心数据是Apple提供的用于开发iOS应用程序的对象图和持久性框架。 它处理对象生命周期,对象图管理和持久性。 它支持用于处理应用程序内部模型层的许多功能,例如: 对象之间的关系管理。 使用撤消管理器更改跟踪 延迟加载对象和属性 验证方式 使用NSPredicate进行分组,过滤和查询 模式迁移 使用SQLite作为后备存储的选项之一。 Core Data自动提供了许多高级功能,它具有陡峭的学习曲线,可供开发人员首次学习和使用。 在iOS 10之前,要在我们的应用程序中设置Core Data,我们需要执行许多配置和样板代码来构建Core Data Stack。 幸运的是,在iOS 10中,Apple引入了NSPersistentContainer,我们可以使用它初始化所有堆栈并以很少的代码获得NSManagedObject上下文。 在本文中,我们将构建一个简单的演示应用程序,该应用程序可从远程《星际大战》 API获取电影列表,并使用后台队列天真地在没有同步策略的情况下同步Core Data存储中的数据。 我们将建立: 受管对象模型架构和影片实体。 电影实体的托管对象。 CoreDataStack:负责使用该模式构建NSPersistentContainer。 ApiRepository:一个类,负责使用URL会话数据任务从StarWars API中获取电影数据列表。 DataProvider:一个类,提供接口以从后台存储库中使用NSManagedObjectContext从数据存储库中获取电影列表并将其同步到Core Data存储。 FilmsViewController:与数据提供者进行通信并使用NSFetchedResultsController从核心数据视图上下文中获取并观察更改的视图控制器,然后在UITableView中显示电影列表。 您可以在项目GitHub存储库中签出该应用程序的完整源代码。 alfianlosari / CoreData-Fetch-API-Background 使用核心数据背景上下文获取Star Wars API的iOS应用– alfianlosari / CoreData-Fetch-API-Background github.com 您还可以通过单击以下网站的链接来结帐并尝试使用StarWars API。 SWAPI –星际大战API 星球大战(Star Wars)API或“ swapi”(Swah-pee)是世界上第一个量化且可通过编程访问的数据源…… swapi.co 受管对象模型架构和影片实体 我们将执行的第一步是创建包含影片实体的托管对象模型架构。 从Xcode创建新文件,然后从核心数据模板中选择数据模型。 将文件命名为StarWars,它将以.xcdatamodeld作为文件扩展名保存。 单击我们刚刚创建的数据模型文件,Xcode将打开数据模型编辑器,在其中我们可以将实体添加到托管对象模型模式中。 […]

Swift中的惰性属性

Swift中的lazy关键字使您可以延迟存储属性的初始化,直到需要它为止。 这种方法的好处是可以提高性能,因为如果不需要立即启动,可以避免启动过程中潜在的昂贵过程。 您可以将初始化视为分配具有初始值的变量。 一个对象可以具有属性,因此当我们初始化它时,它的属性也会被初始化。 定义惰性属性 您可以通过在var关键字前添加lazy来定义lazy属性。 但是,您不能使用常数,因为惰性属性的值仅在初始化后才计算,而常数则需要一个值。 由于使用lazy关键字的目的是将代码执行延迟到初始化之前,因此,简单的自执行闭包是一个完美的用例。 让我们以下面的伪代码 为例 想象一下,我们有一个MathsHelper类,该类可用于计算Pi的值以及其他随机方程的集合。 如果只打算使用它们的一个子集,则无需计算此类中的所有属性。 通过在var前面加上lazy ,可以延迟此操作,直到需要它为止。 这种方法的另一个优点是,我们现在将此属性的声明和设置都放在一个位置。 我可以将计算属性声明为惰性吗? 不。 每次访问计算属性时都会重新计算,但是根据定义,在初始化时,惰性属性仅计算一次 。 这种方法有什么缺点吗? 附加了lazy关键字的var不是线程安全的。 这并不意味着多个线程在尝试访问其值时将创建多个实例,而是如果2个或更多线程尝试同时访问它,则第一个线程之后的任何线程都可能接收到该对象的部分初始化的实例。 在Swift本身中,有一个开放的错误可以解决此问题。 tl:dr? lazy关键字用于延迟变量的初始化 这可以帮助提高性能和启动时间 但是,此行为不是线程安全的

Swift 4的新功能

Swift 4稳定版本即将发布,可从https://swift.org/download/#snapshots下载swift-4.0-branch。 在本文中,我将带您了解Swift 4中新增的一些功能。 安装 swift-4.0 快照工具链 请转到https://swift.org/download/#snapshots并从下载部分获取Xcode。 2.安装工具链后,导航至Xcode-> Toolchain,然后选择Swift 4.0 Snapshot。 我建议选择工具链后重新启动xcode。 多行字符串文字-SE-0168 使用\ n添加新行并在字符串中转义双引号并不总是一件容易的事。 Swift 4通过提供对多行字符串文字的支持解决了这个问题。要开始字符串文字,请添加三个双引号(“”“)并按回车键,按回车键后,开始使用任何变量,换行符和双引号编写字符串就像您在记事本或任何文本编辑器中编写的一样。 要结束多行字符串文字,请在新行中再次写入(“”“)。 让multiLineStringLiteral =“”“ 这是Swift 4中最好的功能之一 它使您无需任何转义就可以写“双引号” 和不需要“ \ n”的新行 “” 打印(multiLineStringLiteral) 产生以下输出。 “这是Swift 4中最好的功能之一,\ n您可以编写“双引号”而无需转义\ n,而无需“ \ n”就可以换行 String will be treated as collection — SE-0163 就像在Swift 1.x版本中一样,可以将字符串视为集合。 您不再需要编写string.characters.xxx即可执行字符串操作。 let message =“消息!” message.count //不需要message.characters.count 用于消息中的字符{//不需要message.characters 打印(字符) } […]

训练营的编码问题

长大后,我在家接受教育。 这可能使我倾向于采用自我指导的学习方法-我喜欢选择内容和制定有效的消费策略的过程。 不过,在早期,我认真考虑过参加编码训练营(至少作为起点)。 自学方法有弊端,特别是如果您在像我这样的自律中挣扎。 这是参加训练营的一些主要优势。 这些好处是假设训练营经过精心设计,并配备了优秀的教师,他们在应用程序开发方面也具有实际经验。 在与他人合作的团队环境中,您将获得从学习到编码的宝贵技能。 您将被迫主要通过专注于项目驱动的学习方法来学习,这种方法可以防止“学习狂热”。 您将从经验丰富的开发人员处收到有关代码质量和方法的直接,持续的反馈。 您将沉浸在行业工具和最佳实践中。 您将可以使用职业服务,并通过遇到的老师和学生建立良好的联系网络。 一些雇主对通过培训计划获得的正式证书比通过自学更有信心。 由于这些重要因素,我着手寻找一个iOS开发训练营。 不愿意搬到现场接受培训意味着我的选择仅限于提供在线课程的学校。 事后看来,这可能排除了一些最佳选择(基于砖和灰浆)。 我也不愿意承担大量债务,因此进一步排除了许多潜在的好的计划。 尽管我进行了所有研究并且对自己的选择充满信心,但在开始在线训练营仅一周后,很明显我做出了一个错误的决定。 在取消信中,我与公司分享了: “感觉这门课程缺少将其与在线或Apple文档中已有的所有内容区分开的独到见解。 我喜欢了解事物的运作方式。 练习中的解释让他们急于尝试通过一系列步骤。” – 2018年2月 在教育行业中,很难分辨出质量营销与质量计划之间的区别。 有时,最好的资源实际上从外观上说服力最少。 课程报告是查找和评估训练营的绝佳场所。 您可以阅读曾就读于这些学校的人的许多详细评论。 我选择的学校获得了很高的评价,所以不要只根据评论来判断。 大多数人认为只要不可怕就可以算是“好”,而且没有什么可比拟的。 我认为存在出色的iOS训练营。 有些人将从他们的自我强加的结构和严谨的工作中受益匪浅。 但是要考虑两个主要因素: 最好的训练营通常是最昂贵的 。 高价格并不意味着高质量,但是低价格几乎总是意味着低质量。 训练营针对特定级别进行了优化 。 如果您的编程经验水平不是他们所针对的,那么即使是高质量的训练营也可能是一个糟糕的选择。 如果潜在的训练营告诉您他们的计划适合任何水平的经验,请远离。 这两个因素最终使我回到了自学方法。 我不希望参加顶级训练营所需的财务风险,而且很难找到一个不会跳过重要基础知识或花很长时间重新引入基础知识的人。 如果您能够自己有效地学习,那么有很多针对各种知识和经验进行了优化的特殊资源,这些资源可以用很少或几乎没有成本的方式获得。 挑战在于知道要使用哪些资源以及在哪里找到它们。 这会使自学方法缓慢而令人沮丧。 但是,这些正是我希望通过分享所要缓解的挑战。 在以后的文章中,我将返回参加训练营的优势列表,并分享我从其他人那里学到的一些策略,以期在自学过程中培养这些相同的优势。 安德鲁 PS:如果您有兴趣参加iOS训练营,那么有一个在我眼中脱颖而出的人:Dev Mountain。 如果位置和成本不是因素,那可能是我的第一选择。 图片来自Unsplash。

扩展👜

大家好,希望生活美好! 😁好吧,今天我想带来更多放松。 我每天都在使用这些扩展名,我想……为什么不共享? 水平摇动动画 结果 垂直摇动动画 结果 设置圆角 设置视图边框 产生眨眼般的效果 我刚刚通过更改视图的alpha属性制作了淡入淡出动画! 太基础了 💁🏻 结果 而且只有淡出才会像⬇️(基于上面的代码)。 我在这里没有给出详细的描述,因为所有内容都是不言自明的,希望您会发现它们很方便并且对您有所帮助🙌 让我们进行协作,使此存储库非常足智多谋,因此,如果您要添加一些东西,例如基本上扩展任何东西,请分叉它! 樱桃/扩展名 扩展-少数扩展使生活变得轻松! 🛀🏼 github.com 祝你有美好的一天️

匿名nil

匿名nil是许多Swift代码库中都存在的一种微妙的代码味道。 它是什么? 为什么会出问题呢? 我们该如何解决呢? 最初在 mczarnik.com上 发布 。 让我们举一个简短, 虚构且非常人为的示例。 假设您的代码库中有一个方法可以显示带有动画的视图。 很明显吧? 不,这不是显而易见的。 这甚至都不合逻辑。 这个例子非常人为 ,但我希望您能明白问题所在。 有什么问题? 无论您为获得此信息做出了什么选择,为什么都必须对自己问这个问题? 好的API可以自我说明,在给定某些输入的情况下解释其功能或性能将是其设计者的失败。 就像物理的东西一样-最好的设计不必解释,只要理解就可以。 这里的问题来自可选的过度使用。 可选的含义很严格。 它的意思是: 有一个值,它等于x或根本没有值 而已。 就是这样 。 在我们的例子中, nil的定义是“屏幕底部的默认动画”。 这个nil有一个意思,但是意思是不同的。 这就是我所说的匿名nil , 它 是用作实际参数或变量/常量 的 nil ,其含义不仅仅是“根本没有价值” 。 有什么后果? 无论您在哪里使用nil作为具有特殊含义的值(而且它根本不是“毫无价值”),都会使您的API用户(包括未来的自我)感到悲伤: 他们可能会浪费时间去弄清楚这是什么意思(有时答案可能隐藏得很深)。 他们可能会遇到许多其他使用相似签名的方法,但是每次看到它们时,他们都需要问自己,来自其他方法的规则在相似的地方是否仍然成立? 他们需要在头脑中保持有关API的易变的元知识 他们甚至可能对系统的行为有错误的假设 您如何使它更好? 通常,我们无力进行适当的依赖注入,否则DI并不是解决此类问题的正确工具。 让我们尝试更多地了解问题,并提出可行的轻量级解决方案。 在我们的情况下,该方法有两种可能的结果: 动画将从底部弹出 特定的非零动画将被执行 难道不像是有两种情况的enum ? 确实是的。 如果我们在代码中使用这种枚举怎么办? 很简单: […]

Firebase Por Prima Vez

真实的经验,不熟悉的Firebase优先权,iOS的不可分割的一体化; 埃斯泰·芬·德·塞玛纳·阿尤达·德·乌达西城,Logéentender首席通信官Firebase。 消防基地,军事基地,军事基地,理想的武器生产基地,基础设施和基础设施。 火力发烧基地,阿尔卡纳德纪念日和纪念日(音频,视频和音频)在游戏中使用。 Los espacios de almacenamiento的儿子直属家庭,由quiens和quienes leen los archivos共同经营。 在Google Play上购买真实的应用程序,在iOS上不使用任何聊天软件,也可以在Google上通过电子邮件发送电子邮件,也可以在Google上通过电子邮件注册自己的照片。 不提供任何担保,不提供任何担保,不提供担保的,请使用苹果提供的担保。 Las reglas aplicadas en la base de datos son distintas entre las de los mensajes de texto y las imagenes ya que con las imagenes es necesario aplicar请求您的资源,con los mensajes basta con que us usario tenga los permisos。 Las imagenes deben […]