Tag: Swift编程

在Swift中通过Date属性轻松地对对象进行分组

我最近创建了一些按月划分的表视图。 这就是我按照对象的date属性对它们进行分组的方式。 我们将使用Doctor Who剧集演示该功能。 这是一种按日期对事件进行分组的方法: 我们使用reduce(into:)将我们的情节数组转换为以日期为键的情节字典。 在此示例中,当月播放的剧集将被分组在一起。 对于每个情节,我们从播出日期的年和月部分创建日期。 我们将当前情节追加到现有数组或空数组中,并将其设置为该日期键处的字典值。 不好意思的解释是抱歉,这篇文章更多地是关于算法的发展,而不是算法的细节。 😅 我们可以将此代码提取到一个函数中: 现在将这些情节归类如下: 让分组= groupedEpisodesByMonth(episodes) 我们可以采取几个步骤,使该方法可用于带有日期的任何模型对象。 首先,我们将创建一个带Dated协议。 然后,我们的函数将接受实现我们协议的任何内容,而不是接受Episode 。 基本上,我们只是将Episode类型替换为Dated 。 现在,我们的呼叫站点如下所示: 让分组= groupedByMonth(episodes) 差别不大,但现在我们可以使用date属性对任何内容进行分组。 我采取了一些额外的步骤来使它看起来更“快捷”。我没有将其保留为函数,而是在Array上创建了扩展名,并参数化了将要分组的日期组件(因此您可以按天分组,或年份等)。 让分组=情节.groupedBy([。year,.month]) 通过用常见情况的枚举来表示日期部分,我们可以使使用起来更加容易。 让分组=情节.groupedBy(.month) 但是我认为我所拥有的足以满足我的需求。 ☺️ 将我们的数据按这种方式分组后,将其以表格视图的形式呈现相对来说比较简单,但是我会再保留一天。 谢谢阅读。 🤲

Swift中[无主的自我]和[弱的自我]之间的区别

在Twitter上关注我: @ kiranjasvanee 在开始深入研究无主且虚弱的事物之前,让我们先谈谈关于ARC的一些知识。 弧 当然,许多人都知道ARC(自动引用计数),当您创建任何类的实例时,它都会分配一块内存来存储有关该实例的信息。 当对象的引用计数等于0时,它将释放内存,因此其他对象可以使用同一内存。 那么,任何对象的引用计数如何变为0? 当没有任何变量指向该对象的引用(内存地址)时,这很简单。 关于保持对象引用的变量数量是该对象的引用计数。 好吧,这是一个基本概念,可以了解有关ARC的更多信息-Swift.org语言指南ARC 无主与弱 简单来说,“无主”和“弱”的工作方式相同,可以解决内存管理的保留周期问题。 两者都不会牢牢抓住它所引用的实例,在门后面都不会增加被引用对象的保留计数。 要了解有关保留周期的更多信息,请浏览相同的文档-Swift.org语言指南ARC。 那么,有什么区别呢? 无主引用不能为零,弱引用可以为零。 听起来很酷,但是实时有什么不同呢? 让我们通过示例来理解这一点。 从这里下载演示项目,如果您只是想了解这个概念,可以不用演示项目就可以继续。 演示中的内容-我们有两个控制器,一个是ViewController ,第二个是UnownedVsWeakViewController 。 可以通过URLSession调用从UnownedVsWeakViewController服务器下载图像。 我从ViewController -> UnownedVsWeakViewController ,然后立即导航(弹出)以了解在UnownedVsWeakViewController已经弹出时,在某些情况下,如[unowned self] UnownedVsWeakViewController [unowned self]或[weak self] ,闭包是如何反应的。 推送到UnownedVsWeakViewController并立即弹出,断点激活后检查调试内存图。 UnownedVsWeakViewController中仍然存在UnownedVsWeakViewController ,而您已经从UnownedVsWeakViewController弹出了。 这只是一个闭包调用,如果有很多闭包完成,您将最终将控制器保存在内存中。 错误的编码方案。 2.让我们尝试通过[weak self]实现这一目标 推送到UnownedVsWeakViewController并立即将UnownedVsWeakViewController弹出,一旦激活断点,检查调试内存图。 UnownedVsWeakViewController中不存在UnownedVsWeakViewController ,当您从中弹出时,它会立即释放。 注意: [weak self]无法阻止完成调用或在完成块内执行语句,只有在self不为nil时,它才会执行那些语句。 不要将自身包装在块中,如果自身为零,它会崩溃。 self !.imageView.image = UIImage.init(data: data!) 3.使用时间[unowned self] […]

字符串(不是理论上的)更新

考虑到我无法购买Apple提倡的许多新配件,我将讨论让Swift 4感到兴奋的一些更新。 如果您有Apple开发人员帐户,请随时下载Xcode的新测试版,这将使您可以使用Swift 4。 字串: 没有人喜欢被串在一起。 如果您从一开始就善于沟通,要么是朝着某个方向前进,要么是建立一种无拘无束的情境。 在当今的现代约会中,似乎我们把Strings做错了,并最终试图纠正这一点。 迭代: 我最终可以访问字符串对象的每个字符,而无需访问characters方法! 数数: 没有什么比自动计数您的字符计数要好了。 我终于可以再次从Strings中受益,进行收集处理。 您是否曾经使用过一个字符串并且只想删除第一个字母? 好吧,现在您可以放下它,就像它很热一样。 相反: 此外,能够访问您的字符串字符并立即反转它们是改变游戏规则的人。 在解决与字符串相关的问题时,我常常不得不依靠能够实现这些方法所能实现的扩展。 这更加直观,将字符串作为序列/集合返回到一个值得尊重的地方。

iOS(背景和前景)—符合要求吗?

Infelizmente -ou felizmente-nãotem magianão,一种可实现API的实现,它依赖于必需的对象和对象。 在GPS导航系统中,需要通过示例性的注册和维护。 Mas,se eujáconsegui suprair todas作为必需品,以及其他API的简单用法或… … Bom,nem semper \ _(ツ)_ /¯ Saber escolher是“功能强大的API”,其性能和功能都将在无损保护的情况下发生,包括制式,测试标准和无线网络。 第一件事: CoreLocation框架 确定地理定位的位置,海拔高度或灯塔位置。 可以使用Wi-Fi,GPS,蓝牙,barômetro,magnetômeeo硬件等框架来进行信息收集。 一个苹果公司的可替代性框架,它可以在地理上与当地环境隔绝,也可以在基础服务框架上提供良好的定义,并具有必要的作用。 O的核心位置,可以用特殊的方式在当地使用通用的本地化服务。 1.标准位置服务 主要控制权是本地化,高级配置,常规和正常使用的准证。 由中高级消费者提供的中高级预防法和中性服务 互联网的基础设施。 使用中或永远 使用时的必要条件。 Quando utilizar:必须对语言进行必要的复制,例如,必须对示例进行复制。 2.重大变更位置服务 递归消费者关系的决定性条款决定了当地使用权。 Ele notificamudançasdelocalizaçãoquando ousuáriotem um deslocamentothinkável,quetambémpode ser configurado,porémcomvalormínimode 500地铁。 Essa API要求永久使用。 Quando utilizar:在da s das上的aplicativos que precisam de mass commenosfrequênciaouprecisão。 举例来说,使用复制品进行分析的目的是要证明自己的目的。 3.拜访定位服务 为获得重大成就而进行的地点续集,请使用我们的临时机票。 […]

构建移动应用程序:首先离线,最后离线!

“由于互联网连接可能不稳定或不存在,因此您需要首先考虑离线:将您的应用编写为没有互联网连接。 一旦您的应用程序脱机工作,请添加您的应用程序所需的任何网络功能,以使其在联机时能做更多。” [来源:脱机优先] 但这很痛苦,对吧? 脱机代码,在线代码,对网络连接的更改做出反应,解决数据冲突,yadda,yadda。 大量的时间和低级的代码花费在移动数据上。 但是,我们必须正确地做。 精心设计的移动应用程序可让用户完成工作,而不会抱怨互联网连接的不足或质量。 在我的工作中,我看到了与Salesforce平台集成的自定义移动应用程序的许多有趣用例,而脱机需求通常最难满足。 因此,我对试用Realm的新对象服务器(其移动平台的后端)非常感兴趣: “ Realm Mobile Platform在服务器和设备之间提供自动和无缝的实时数据同步以及强大的事件处理功能。 您无需再考虑网络代码。 Realm Mobile数据库是跨平台的,同时支持iOS和Android,并且Realm Object Server可以在您的服务器或您喜欢的云上运行。” [来源:Realm Mobile Platform] 听起来很有希望,所以我着手研究如何将Realm Object Server与Salesforce集成。 更具体地说,我想看看是否可以监视通过Realm的示例移动应用程序“ Realm Tasks”进行的数据更改,然后相应地创建和更新Salesforce任务记录。 而且我在短短几分钟内就做到了(好吧,这还不包括阅读Realm文档以及了解如何设置自定义事件监控所需的时间)。 领域对象服务器太棒了! 我在移动设备上修改了数据,该数据几乎立即显示在Realm Object Server中。 我使设备脱机,更新了设备和服务器上的数据,然后看着我重新打开WiFi后毫不费力地同步了本地数据库。 Realm Object Server忠实地通知了我的事件监视器,该事件监视器触发了对Salesforce的API调用。 根本没有用于处理数据同步的代码,只有一个相对简单的Javascript文件即可监视事件并更新Salesforce。 请参阅GitHub上的源代码。

RxSwift:Mengawasi可观察属性di Semua元素数组Secara Bersamaan dengan Observable.combineLatest()

Judul yang panjang,塔皮萨达提达克menemukan judul yang lebih baik untuk pikirkan oleh程序员pemula dengan kasus yang sama kecuali关键字di atas。 Jadi saya berharap dengan judul yang panjang namun jelas maka tujuan dari artikel ini telah didefinisikan sejak awal。 >简洁明了 就像Swift的方式一样! Kasus: Seperti yang saya katakan tadi,Kasussaya dapat disimpulkan oleh judul dengan cepat。 可以观察到Saya memiliki数组dari sebuah objek yang memiliki属性。 丹·赛亚·英金·琼脂·塞蒂亚普·佩鲁巴汉·达里·特雷塞普·阿塞·迪·塞巴坎·科塞蒂亚普的观察员yang […]

FireBase〜认证

使用FireBase注册,登录,注销 官方参考资料:https://firebase.google.com/docs/auth/ios/start 备注:导入Firebase 使用Auth.auth()。createUser在FireBase创造新的使用者 FireBase就会产生一个新帐号 判断FireBase中是否有符合的电子邮件与密码的资料,来进行登录 登出比其他还简单,但注意这是个『throws』需要用『do』『catch』 陆续更新FireBase功能〜

Swift 4.2初学者核心数据(CRUD)

核心数据是Apple在macOS和iOS操作系统中提供的对象图和持久性框架。 它是在Mac OS X 10.4 Tiger和带有iPhone SDK 3.0的iOS中引入的。 它允许将由关系实体-属性模型组织的数据序列化为XML,二进制或SQLite存储。 提取保存的数据的过程也非常容易。 它具有以下任务 准备实体的NSFetchRequest类型的请求(在本例中为User) 如果需要,使用谓词来过滤数据 从上下文中以[NSManagedObject]数组的形式获取结果 遍历数组以获取特定键的值 我们可以使用以下代码从Users实体中获取数据。 对于更新记录,我们必须使用与上述“检索数据”过程相同的谓词来检索/检索数据。 然后按照以下几步操作 使用实体谓词准备请求(在我们的示例中为User) 获取记录并使用键设置新值 并且Last Save上下文与创建数据相同。 对于删除记录,首先必须找到要通过fetchRequest删除的对象。 然后按照以下几个步骤删除记录 使用实体谓词准备请求(在我们的示例中为User) 获取记录以及我们要删除的记录 并进行context.delete(object)调用(参考下面的图片) 好吧,这还不足以支持核心数据,我们可以通过跟踪数据更改,添加谓词和数据库的复杂关系来完成许多复杂的事情。 随着您使用更多的核心数据,事情变得越来越复杂。 从这里下载完整的源代码

尝试! Swift India 2017 – iOS会议体验

那是2017年一个夏天的好早晨,我正在阅读常规技术博客。 那就是我遇到的一个针对iOS Swift用户的Slack频道(Swift印度)。 我也在所有iOS项目中都使用Swift,因此我自然成为该社区的成员。 这个想法是为了验证我对Swift的理解,向他人学习,熟悉社区标准(库,编码实践等),并在适当的时候与社区分享我的经验。 在过去的几个月里,我从这个社区中学到了很多东西,最后一个周末,当我参加第一次Try时,锦上添花。 在班加罗尔举行的Swift印度2017年会议。 几年来我没去过B’lore,因此在会议日的两侧计划了一个缓冲区,以期游览各个景点! 但是,到达B’lore时,我的名气traffic吓住了我😃,因此在接下来的3天里,我的旅行限制为夜间/业余时间(从浦那飞往班加罗尔的航班比到从B’lore机场到Horamavu bus乘坐巴士的时间。 我很开心与朋友们见面,在IMAX上观看JusticeLeague(男孩子真倒霉),并且在NiceRoad上长途跋涉,没有交通拥堵(一个神奇的技巧被朋友拉开了!) 我在星期天(17年11月19日)清早开始到达(之前)的会议地点……我本来不想错过任何事情! 组织团队已经安排好了观众。 我拿到了徽章,使自己在会议厅里感到舒服。 甚至在Chris谈判开始之前,活动的官方“魔术师”就已经使观众迷上了他的炫酷魔术。 (在一天的最后,我感谢Chris为使活动生动有趣而付出的努力!) 短暂休息一下茶后,娜塔莎宣布赠书。 这本书是保罗·哈德森(Paul Hudson)撰写的一本“ Pro Swift”。 快速浏览一下这本书,我发现它非常有价值; 特别是在诸如flatMap()之类的函数式编程构造,Swift中的设计模式等方面。 第一组演讲者是Jono Guthrie,Satoshi Hachiya和KS Sreeram。 Juno引入了几个Swift框架,例如Vapor,Kitura,Zewo,SCADE和Swift Package Manager。 最初的演讲将会议气氛定为Swift作为前端和后端的语言。 中本聪的演讲“什么是Swifty?”围绕使您的Swift代码为“ Swifty”的内容展开。 演讲的重点是遵循Swift API指南。 Sreeram的演讲使观众想象到一个机器与人类并排编码的世界。 他的演示非常有趣,其中机器在字典的帮助下对单数生成器进行了编码。 短暂休息时,我看到了Google Firebase团队的一些熟悉面孔。 在浦那的Firebase DevFest期间,我与他们进行了互动。 很高兴看到不同的技术社区相互融合,以尝试不同的技术堆栈。 接下来的发言人是Sai Hema Kanduri,Mugunth Kumar,Aishwarya Kumar和Cate Huston。 赛伊谈到了她为开源做贡献的过程。 根据她的说法,关键是早点开始,从小处开始,而不是等待大的事情。 直到她说出这句话后,我才大吃一惊,但是使开源项目的文档更具可读性和有效性也可能是其自身的巨大贡献! Mugunth讨论了自从最新版本的iOS11以来,开发人员可以使用的CoreML功能,以及它为开发人员带来的相应优势。 Aishwarya讨论了Flipkart如何通过使用Realm,使用LinkedIn的LayoutKit,AsyncDisplayKit(现在称为Texture)以及实现Flux设计模式等方法来摆脱其App的掉帧问题。 午餐后,接下来的发言人包括Kamilah Taylor,Vatsal […]

了解Swift 4中的泛型函数和类型

编写可维护的代码应该是每位软件工程师都应该意识到的一个问题,因为从长远来看,它具有回报。 通常,为了尽快完成工作,我们倾向于重复自己。 这通常涉及复制和粘贴我们可能对函数的类似实现,并进行调整以适合我们想要的内容。 复制在某种程度上增加了复杂性并阻塞了可读性。 一个好的方法总是尽可能多地采用DRY(不要重复自己)原则。 在我们的代码中,考虑如何设计API和适应的应用架构非常重要,因为从长远来看,这会影响代码的可维护性。 因此,回到讨论主题。 Swift中的泛型。 使用通用代码,我们可以编写可重用的函数和数据类型,这些函数和数据类型可以与匹配我们定义的约束的任何类型一起使用。 目的是排除共享功能并减少样板代码。 我们有约束和不受约束的泛型。 对于不受约束的泛型,我们不能对它们做太多事情。 受约束的泛型用协议表示。 我们所知道的协议在其符合类型上声明了一组要求。 在这一点上,让我们通过具体示例更深入地探讨实际问题。 解释够了吧? 是的,让我们这样做。 我们将使用Xcode Playground。 因此,随着我们的前进,请随时在操场上测试代码。 我们将从无约束的泛型开始,但是我们不会浪费时间,因为我们不能真正地对无约束的泛型做很多事情。 上面的参数化函数可以接受任何类型的输入。 我们可以将输入值复制到局部变量,然后从函数返回它。 我们也可以将函数传递给另一个函数。 这就是我们可以使用此不受约束的泛型函数所能做的事情。 因此,现在让我们看看受约束的泛型函数。 首先,我们将在不使用泛型的情况下进行常规实现。 然后,我们将使用泛型来排除共享功能并减少样板。 我们的示例将通过decodable协议从网络中获取数据并解码json响应。 我们将从https://jsonplaceholder.typicode.com/获取数据,其中包含用于测试的虚拟数据API。 通过仔细查看上面的函数,我们可以轻松地看到fetchPosts和fetchComments函数有很多共同点。 它们之间的唯一区别在于不同的Post和Comment模型对象,这些对象符合我们传递给JSONDecoder的可解码协议。 因此,这是一个很好的地方,我们可以使用泛型来避免代码重复。 注意:我们正在从上述函数同步获取数据。 在生产代码中,建议异步获取数据,以避免在等待下载完成时冻结UI。 因此,让我们继续提取通用函数,我们可以轻松地重用它们而无需重复自己。 因此,使用泛型,我们已经能够提取两个功能之间的共享功能。 因此,使loadResources可重用。 我们将该函数限制为可解码协议,以帮助我们根据分别来自用户特定函数loadPosts和loadComments通过完成处理程序传递的模型对象类型来解码json数据。 编译器将能够在运行时根据我们传递给完成处理程序的类型来推断参数类型。 在总结泛型之前,还有一件事是看一下泛型类型或数据类型 。 我们将实现一个通用类型,以执行与从网络中获取数据相同的操作,但是这次,我们将使用 结构 。 就像函数一样,结构也可以是泛型的。 通过以上操作,我们设法减少了postResource和commentResource实例,以描述资源所在的位置。 我们已经将网络部分完全分离出来了。 因此,使用这种方法,测试变得更加简单,因为我们可以轻松地测试该结构的实例以了解其是否完整形成。 从以上代码中,我们还有两个功能,一个功能同步执行资源加载,另一个功能异步执行操作。 基本上,除了使用URLSession异步API外,两者之间的区别是在异步函数中使用了注释关键字@escaping 。 这样做是为了确保完成处理程序转义方法的范围,因为我们正在处理异步请求。 因此,最后,我们已经能够解释如何在Swift中实现泛型函数和类型。 我知道现在您对自己今天学到的东西感到高兴。 […]