Tag: Swift 4

Swift 3和4学习曲线:10条秘诀和成功链接

您是Swift大师吗? 或者只是尝试开始学习Swift? 无论您处于Swift学习曲线上的哪个位置,都无关紧要,这里有10条提示可以帮助您成功并不断进步。 0.阅读文档 是! 就这么简单,只需阅读https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html语言的官方文档。 它是Swift本身最好的知识来源,其专业编写和维护得很好。 只是不要被自己欺骗,一旦阅读它会使您成为一名Swift大师。 第二次,第三次阅读,用作参考,并记住:重复是持久性的关键。 1.在操场上尝试一下您刚刚读过的东西 如您所知,您不应为了在Swift中进行实验而创建新项目:相反,游乐场是实现这一目标的最佳方法。 这里的关键是尝试自己编写文档中的每一行代码 。 您可能会发现编写简单的示例有点傻,但是请相信我,有时候即使没有一行代码,也很难在没有错误的情况下编写相同的东西。 您可以将一个游乐场用于一个主题,以避免混乱,因为在您浏览过程中,代码会迅速累加。 2.开始向您的项目添加一些Swift 不必用Swift编写所有项目。 您几乎可以毫无问题地开始向您的Objective-C项目添加新的swift文件。 只要确保您已阅读有关混合Swift和Objective-C的本节,即可查看https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html 3.遵循代码风格和API设计准则 首先,遵循代码风格是专业开发人员的一个属性。 它可以帮助您更快地学习Swift! 这不仅涉及代码格式。 您可能已经注意到,在Swift中通常有几种方法可以完成相同的事情,并且有很多“语法糖”。 准则使您在选择方面保持一致,可以帮助您做出选择并允许发现该语言的新可能性。 好的样式指南可以在这里找到:https://github.com/raywenderlich/swift-style-guide。 另外还有一些有关它的官方文档值得阅读:“ Swift API设计指南” https://swift.org/documentation/api-design-guidelines/ 4.教程是理论和实践的良好来源 谁不知道Ray Wenderlich团队及其为iOS开发人员提供的著名教程? 大约一年前,他们为您准备了8篇更新到Swift 3的教程:https://www.raywenderlich.com/146853/8-free-swift-tutorials-updated-for-swift-3 您还可以找到Swift 4。 确保您正在练习以取得最佳效果! 网络上还有许多其他教程: http://swift3tutorials.com/ https://code.tutsplus.com/categories/swift-3 https://code.tutsplus.com/categories/swift-4 您可以自己找到更多! 5.探索他人的代码 我最喜欢的之一。 已经有很多用Swift 3和4编写的很棒的开源项目。“很多”是什么意思? 只需在这里看看:https://github.com/matteocrippa/awesome-swift。 挑选您喜欢的项目并探索代码! 在页面上搜索“ Swift 3”或“ Swift 4”以查找以Swift 3和4编写的库。 […]

掌握CoreData(第2部分核心数据栈)

核心数据栈 了解核心数据堆栈非常重要。 许多开发人员不花时间去学习它,这在使用Core Data时使他们的生活陷于瘫痪。 核心数据堆栈是框架对象的集合,这些框架对象是核心数据初始化过程的一部分, 可以在应用程序中的对象与外部数据存储之间进行调解 。 该堆栈提供了与数据模型层对象关联的所有功能或任务。 我们在第1部分中讨论的功能 核心数据堆栈由以下对象组成→一个或多个托管对象上下文连接到单个持久性存储协调器,该协调器又连接到一个或多个持久性存储。 托管对象上下文(MOC) 它的主要职责是管理一组托管对象(实体)。 受管对象上下文通常在内存中维护实体的状态。 完成对此类对象的操作后,您将保存此类MOC,通常将其保存到持久性存储协调器到持久性存储 它位于核心数据堆栈的顶部,您的应用程序将与大多数应用程序进行交互,因此它是暴露给应用程序其余部分的应用程序 应用程序可以为每个堆栈创建一个或多个 MOC。 上下文连接到持久性存储协调器或来自父上下文 它提供缓存,更改跟踪,延迟加载,重做,撤消和验证功能 持久性存储协调员(PSC) NSPersistentStoreCoordinator的实例。 协调器是核心数据堆栈中的中心对象。 持久存储协调器的作用是管理多个/单个存储 ,并向其管理对象上下文提供单个统一存储的外观,如下图所示,该图协调器与多个存储进行通信。 它具有对托管对象模型的引用,如下图2.1所示。 持久性存储协调员可以交谈或引用堆栈中的大多数组件 永久商店 您可以将持久性存储视为数据库文件(Sqlite),其中的每个记录均包含托管对象(实体)的最后保存值。 核心数据还提供了一个内存存储,其存储时间不超过流程生命周期的时间 我们可以在每个堆栈上创建多个持久性存储 Core Data为持久性存储提供了三种本机文件类型:二进制,XML和SQLite。 如果您希望Core Data与自定义文件格式或服务器进行互操作,则可以实现自己的商店类型 被管理对象 NSManagedObject的实例。 它代表持久性存储中的记录 向托管对象上下文注册托管对象。 在任何给定的上下文中,最多存在一个与持久存储中给定记录相对应的托管对象实例 托管对象模型 托管对象模型是一组对象,这些对象一起构成了一个蓝图,描述了您在应用程序中使用的托管对象 您的应用程序中使用的模型对象的架构 持久对象库 持久性对象存储在应用程序中的对象之间映射,并在持久性存储中记录。 Core Data支持的不同文件类型有不同的持久对象存储类 如果要支持自定义文件类型,也可以实现自己的文件 您不会直接创建持久对象存储。 相反,Core Data在发送时会为您创建适当类型的存储 向持久性存储协调器发送的addPersistentStoreWithType:configuration:URL:options:error:消息。 摘要 在这一部分中,我们讨论了核心数据栈。 这部分目的是将理论上的东西放在一个地方。 如果您对核心数据栈一无所知,请不要担心我们何时进行编码部分,当我引用这些要点时,这些要点将变得清楚。 […]

在本地和远程使用CocoaPods分发框架

在本教程中,我们的重点是创建一个框架,然后在本地和远程在我们的应用程序中使用。 框架是分层目录,它将共享资源(例如动态共享库,nib文件,图像文件,本地化字符串,头文件和参考文档)封装在一个程序包中。 多个应用程序可以同时使用所有这些资源。 系统会根据需要将它们加载到内存中,并在可能的情况下在所有应用程序之间共享资源的一份副本。 框架的好处 代码/功能模块化 在多个应用程序之间共享代码 在多个应用程序之间共享资源 作为第三方库分发 最适合并行工作的团队 为iOS创建框架 在Xcode中,选择File> New Project创建您的项目>在Framework&Library部分中,选择Cocoa Touch Framework>单击Next>输入产品名称“ MyFramework ”,如图1所示>单击Next>选择Location> Create。 Framework已创建,如图2所示,名称为MyFramework 框架的责任是从服务器获取数据并随数据一起返回给使用者。 让我们创建一个swift文件从Xcode中,选择File> File> Swift File> APIRequestLoader > Create 如图3所示,我们完成了框架代码。 要使用此框架,客户端需要提供符合APIRequest协议的对象,在该对象中,它使用预期的请求和响应数据类型实现make和parseResponse方法。 生成框架项目,以确保在没有生成警告或错误的情况下获得成功的生成 。 至此,我们创建了框架。 现在创建一个消费者项目。 选择“文件”>“新建”>“项目”>“在应用程序”部分中,选择“单视图应用程序”,然后单击“下一步”>在出现产品名称的对话框中: Consumer >“下一步”>“创建”。 如图4所示,我们创建了一个消费应用程序,它将使用我们的框架服务。 使用拖放来消费框架 转到MyFramework项目>右键单击Products文件夹下的MyFramework.framework >单击在Finder中显示。 这将重定向框架的位置 现在打开Consumer应用程序,并将框架拖放到项目中。 确保检查是否需要复制项目,以便文件实际复制到新项目中,而不仅仅是添加引用,如图6所示。 如图7所示,将框架放入项目中。 它已添加到“链接框架和库”部分。 通过选择框架从本节中删除它,然后点击减号 现在点击Embedded Binaries上的加号并添加框架,如图8所示。 如图9所示,现在添加了MyFramework.framework 。 在“ Embedded Binaries部分添加框架会将其也添加到“ Linked […]

核心数据CRUD

在本教程中,您将学习如何使用Core Data框架从持久性存储中插入,获取,更新和删除数据。 您将执行的步骤: 使用集成的核心数据创建一个新项目 创建一个新实体 将数据插入持久性存储 提取实体的所有数据 使用实体的ID提取实体的托管对象 更新管理对象的数据 删除托管对象 清除实体的所有数据 如果您遇到以下任何问题,可以在此处下载完整的源代码项目。 1.使用集成的核心数据创建一个新项目 创建新项目时,请选中“ 使用核心数据”选项。 因此,Xcode将为您准备使用骨架数据的框架 Xcode创建项目之后。 Xcode为您添加了2件事: AppDelegate.swift文件中的几行代码 [项目名称] .xcdatamodeld文件 打开AppDelegate.swift文件,您将看到一些代码行,如下所示: 接下来,选择菜单编辑器->创建NSManagedObject子类 。 遵循Xcode的指南为您创建NSManagedObject的子类 3.将数据插入持久性存储 要将数据插入持久性存储中,首先,需要实例化一个托管对象,为其属性填充内容并保存上下文。 将以下代码段添加到您的视图控制器中: 运行该应用程序,一切都会正常进行,并出现错误。 4.提取实体的所有数据 首先,您需要阅读以下一些文章,以了解如何从持久性存储中获取数据: NSFetchRequest 用于从持久性存储中检索数据的搜索条件的描述。 取(_:) 返回满足给定提取请求指定的条件的对象数组。 显示插入的内容。 将以下方法添加到视图控制器中: 运行该应用程序,该人的信息应显示在控制台日志中 5.使用实体的ID提取实体的托管对象 每个管理对象都有一个全局ID。 使用此全局ID,您可以获得托管对象。 全局ID的格式如下: x-coredata://F172B5AC-C592–42AC-8110-D968E3B69FC9/Person/p8 要获取托管对象的全局ID,请使用以下代码行: managedObject.objectID.uriRepresentation().absoluteString 从此全局ID可以使用以下代码行获取托管对象: managedObjectContext.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: URL(string: globalID)!) 将以下代码段添加到您的视图控制器中,以显示第一人称的信息: 运行该应用程序并查看控制台日志。 6.更新管理对象的数据 要更新托管对象,只需更新该托管对象的属性并保存上下文。 将以下代码段添加到您的视图控制器中: 运行应用程序并检查控制台日志 […]

Swift 4中的命令模式

命令模式将请求封装为对象,从而使您可以将具有不同请求,队列或日志请求的客户端参数化,并支持不可撤销的操作。 当需求类似时,命令模式很有用–会有很多操作要做一个接一个的操作。 考虑到每个操作都非常耗时,因此您不能直接调用执行该操作的方法。 传入操作请求的速率高于整理每个操作。 要处理这种情况,您需要将每个操作/命令封装在一个对象(又称为命令对象)中,并将它们存储在队列中。 然后依次处理从队列中取出的每个命令。 这一切都与命令模式有关。 命令模式在日志记录框架,数据库事务和计划的操作中有多种用法。 Command模式的另一个不错的方面是Command Executor (可以是单独的线程)不需要知道命令以及与要执行的命令相关的上下文信息。 这样,可以随时构建更多的命令/操作,而无需更改已编写的现有代码。 类型:创作模式 也称为:动作,交易 结构体: Swift 4实现: 我们的上下文将是一个Book对象,我们要在其上执行不同类型的命令。 将有3种命令类型: Buy,Sell,GiftFriend 。 BuyCommand:从图书馆购买书籍,然后将所有者设置为我。 SellCommand:将书籍出售到图书馆,并将所有者设置为图书馆。 GiftFriend:将书赠给提到名字的朋友。 让我们编写上下文类Book。 您可能会对Book类中的buy(),sell(),giftFriend()之类的方法感到惊讶,并问自己这些方法应包含在命令类中。 没有! Command对象将调用这些方法,因为这些方法将执行实际任务。 如前所述,三种命令类: CommandExecutor负责一个接一个地运行命令。 它可能是一个不同的线程,但是为了简洁起见,在这里我们使用了while循环和runCommand()方法,它将一个接一个地运行所有命令,直到命令队列结束。 现在像往常一样,感受命令模式的力量。 您可以在此处找到完整的源代码:Github

Swift4 Day-06控制流(1)

Swift提供了许多控制流的方式,在本篇终将说明其用途及使用时机 在前面介绍集合的时候,我们就常常使用for in回圈来遍历整个集合的内容 for in回圈也能遍历数字区间,可以很简单就算出九九乘法表,以下用9来做示范 我们来解释一下上面的程序代码;上面的number代表1〜9的数字,依序进入「print(“ 9 * \()number)= \(9 * number)”中,即印出结果。 再一个例子,现在我们要算2的1〜9次方: 这里解释一下,要算a的b次方,在Swift里的公式不是a ^ b,而是pow(a,b),其中a及b的值都要是Double型态,所以上面的数字从Int转为Double型态。 若你希望若你希望资料以间隔的方式呈现,可以使用大步向前来叙述你的条件,其中是在指定的值前停止动作,而通过是包含指定的值: 在Swift中,而提供了两种while的循环:while和repeat-while。分开在于repeat-while再进行判断前一定会执行一次内部程序,再去进行判断;而而则是先判断条件,再去决定要不要执行程式。 while vs repeat-while =先奏后斩vs先斩后奏 而 而条件{ 要循环执行的程式 } 举个例子: 重复的 重复{ 要循环执行的程式 }而条件 举个例子: 条件语法根据不同特定条件去执行特定的程序。 如果 最简单的形式纸偶一个表达句,当条件返回true才会去执行内容程序码;而需要去判断false后执行程序码,就需要加入else,就会去执行设定的另一段程序码,else是不一定要存在的: 也可以在else后面加上if继续去判断: 如果让 宣告一个临时常数或变数,并且执行内部程序,这个临时常数或变数只能在这个如果if使用。if及while都可以使用: 上方的程式码在判断常数number不能过渡成为整体型别 开关 上面的if语法都是很简单的判断true或false而已,如果我们需要判断比较复杂的条件,就可以考虑使用switch。switch放置一个值比对多种情况(case),然后去执行对应到的程序,所有case必须涵盖全不可能的情况,如果没有就需要在最后面补上default,一但有case的程序被执行,switch就不会继续比对下去: 开关值{ 情况1: 相对应情况1执行的程式 case情况2,比对情况3://多个情况可以用逗号,替换相对应情况2或情况3执行的程序 默认: 以上情况比对都不成功时执行的程式 } case必须包含一个纠正的语句,否则会产生错误 如果不想停止,想继续执行程式码,可以加入fallthrough 值绑定 case可以将比对的值绑定(value binding)到一个临时的常数或变数,盔甲在程序内使用: 另外可以使用where来判断其他条件: ・ […]

在Xcode 10中使用代码段

每次要实现功能时,您是否厌倦了编写或复制/粘贴大量代码😩? 您是否希望有一种方法可以通过键入一个关键字轻松地调用代码? 如果是这样,那么您很幸运! 因为Xcode具有一个称为代码段的强大功能! 它节省了您大量的时间和精力,而且您像专家一样编码!coding 2-在下一个窗口中,您可以编辑代码和/或以自己喜欢的方式自定义代码。 标题:您的摘录名称 摘要:它是做什么的? 平台: IOS,Mac OS,TV OS…。 语言:当然可以! 🙂 (或目标c) 完成捷径:输入以下字母即可使用您的代码段… 完成范围 :您想在哪里查看代码?(仅在函数,类或其他任何地方!) 而已! 您现在只能通过输入完成范围中的字母来使用代码段。 但是等等 您可以使用占位符来使代码段更加高效。 使用您要用作占位符的关键字并将其放在这些字符之间 结果如下: 而已! 现在您可以在项目中使用它们,尽情享受吧!😊

迅速移动!

这有点哲学性,所以请忍受我。 我一直认为没有正确的时间去错! 但是我想我错了,显然错误的正确时机是当您知道自己是可以改变它的时候。 为了更加了解我的情况,我接受了迅速的采访,我几乎不了解函数式编程。 我想知道为什么它与Obj C有如此大的区别,但是当我偶然发现函数式编程时,我知道了原因! 我确信从C到C ++时,某些ppl有相同的经验(几十年前)。 用不同的范式思考就像是观念的转变。 就像那些拼图,您改变了视角,然后拼图看上去就完全不同了。 Swift是真正的现代编程语言。 因此,最好地理解它最好理解其设计中已包含的基本思想。 swift背后的基本思想之一是迈克尔·费瑟斯(Michael Feathers)的这则推特最恰当的描述,该推特谈到了函数式编程与面向对象编程 “ OO通过封装活动部件使代码易于理解,FP通过减少活动部件使代码易于理解。” Swift通过添加枚举和结构之类的值类型数据结构来减少活动部件,如果不能将一个对象简单地传递给一堆函数(将其变异),则更容易发现问题出在哪里,理论如下如果语言公开较少的潜在易错功能,则开发人员更不可能犯错误。 在初步了解之后,我回到了功能范式的基础,然后将重新学习更深入的知识,并计划在接下来的几周中记录自己的经验。 我希望这对于从Obj C到迅速发展的任何人都是有用的指南!

Swift – UINavigationController的层次结构(以编程方式)🎯

大家好,我们今天将讨论UINavigationController 。 🤠 UINavigationController允许您管理堆栈中的大量视图控制器。 我来解释一下 您有一个具有主 控制器 ,登录 控制器和注册控制器的应用程序,该应用程序开始在主控制器上运行, 您有两个按钮可以推动登录/注册控制器。 是的,您可以通过UINavigationController! 如何使用导航控制器(以编程方式,没有情节提要)设置项目 1-您必须删除项目上的.storyboard文件。 2-如下所示,您必须在项目导航器>选择项目>常规>部署信息>主界面上删除情节提要名称。 3- 让我们修改AppDelegate文件 我们在主控制器上有两个按钮, 您可以通过按钮来推送登录/注册控制器。 您可以在GitHub上访问项目文件。 😎 strawb3rryx7 / UINavigationController-示例 UINavigationController-示例–如何在没有情节提要的情况下创建基于UINavigationController的应用程序。 github.com 1-动态更改UINavigationController的rootViewController 这是一个好话题。 让我们解释一下, 为什么我们需要更改Root View Controller? 您的用户已成功登录到您的应用程序,然后在已经登录时终止了该应用程序。在下一次,您不希望他们能够遇到主控制器或 登录控制器。 因此,您将在启动应用程序时确定AppDelegate,可以确定它们是否已登录并相应地设置rootViewController 。 但是,是否要注销? 在这种情况下,您必须将其rootViewController设置为主控制器。 我将与您分享我的解决方案。 在此扩展中,您将能够设置新的rootViewController 。 我建议您遵循注释行。 我解释了他们在那里做什么。 另外,UINavigationBar有一些项目,如您在图像上看到的,这些项目在下面列出。 backItem topItem.title topItem.leftBarButtonItem topItem.rightBarButtonItem backItem 您可以将以前的控制器备份到导航堆栈中。 有一些属性可以管理它们,您可以在 Apple Docs 上找到它们 。 Apple文档提供的backBarButtonItem […]

在Swift中探索范围类型

Swift 3版本附带的许多很棒的功能之一是Swift标准库中的Range API,自那时以来,它一直在不断改进。 在此之前,我们只有NSRange,它是Foundation框架的一部分。 在今天的文章中,我将尝试解释有关Range,ClosedRange,PartialRangeUpTo,PartialRangeThrough和CountableRange的知识,所有这些类型的范围之间的区别以及如何使用它们。 所以…开始吧 首先,让我们讨论范围,然后再探讨其他范围。 从Apple标准库提供的文档范围是… 一个可比类型的半开间隔,从下限到上限(但不包括上限)。 范围类型具有Bound泛型类型,可以是符合Comparable协议的任何类型。 这意味着您可以使用Int,Double,String…甚至您自己的自定义类型创建范围,因为它们符合Comparable协议。 从Apple标准库文档中,ClosedRange是… 从下限到上限(包括上限)的可比较类型上的间隔。 Range和ClosedRange之间的唯一区别是ClosedRange包含上限。 根据Apple标准库文档,CountableRange是… 从Swift 4.1开始,只是Range 的类型别名,其中Bound符合Strideable和Bound.Stride符合SignedInteger。 正如您将在下面在类型别名的定义中看到的那样。 通过利用条件一致性,Range符合Sequence,Collection,BidirectionalCollection,RandomAccessCollection,其中Bound符合Strideable和Bound.Stride符合SignedInteger,即CountableRange。 如您所见,标准库源中的条件一致性定义位于stdlib / public / core / Range.swift上 因此,您可以将范围用作集合,并可以使用距离,索引,反向,映射,过滤器等功能…… 相同的规则应用于CountableClosedRange ,不同之处是ClosedRange 的类型别名,对Strideable和Bound应用相同的一致性。对SignedInteger约束的跨度一致性。 现在,上限已包含在集合中。 OBS:仅进行了数组转换,因此我们可以在操场上看到范围和封闭区域已经是Collection。 再次…… 根据Apple标准库文档,PartialRangeUpTo是… 部分半开间隔,但不包括上限。 与Range相同,但只有上限。 再一次 … 从Apple标准库文档中可以找到PartialRangeThrough… 部分半开间隔,直到并包括一个上限。 与ClosedRange相同,但是只有上限。 我发誓这是最后一个…… 根据Apple标准库文档,PartialRangeFrom是… 从下限向上延伸的部分间隔。 与ClosedRange相同,但只有下限。 协议RangeExpression是所有这些类型的范围都遵循的协议之一,它定义了一个名为contains的方法,该方法可以验证值是否包含在范围内。 也有〜=运算符执行相同的检查。 如您所见,它非常简单而且非常有用。 如果您好奇并想了解如何在后台实现这些类型,可以在Swift的Repo的stdlib / public / core / […]