Tag: Swift 4

Swift中的In-Out参数

嗨,我将向您介绍Swift中的In-Out参数。 什么是输入输出参数? 我们为什么要使用它? 我们想在哪里使用它? 阅读本文以清除您的问题。 问题1:什么是输入输出参数? 如果我们阅读了Apple的官方文件,我们可以看到它说: 为了简单起见,可以这样说: inout 表示修改局部变量也将修改传入的参数。 没有它,传入的参数将保持相同的值。 以使用In-Out参数为例: 以下功能有助于交换值。 a的值存储到临时变量A中。 b的值分配给a。 然后赋给临时A的值 到b。 问题2:如果在上述示例中将inout替换为var怎么办? print(firstNumber)将打印6 。 和 print(secondNumber)将打印7 。 下面的视频将帮助您了解In-Out参数的工作原理。 祝您阅读愉快!!!!……再见🙂

命名功能参数

小而重要 快速地,命名参数有些不同。 在我的学习过程中,我需要学习很多东西,因此我不想关注诸如命名函数参数之类的小细节,除了我不知道swift具有此功能。 随着时间的流逝,我不得不阅读其他快速代码并弄清楚开发人员想要做什么,然后我在他/她的方法中看到了单独的参数名称,这让我停下来思考一下。 这对于可读性来说是非常酷的功能。 因此,让我们看看如何使用它们。 美化快捷功能 让我们从示例开始: func introTo( 参数命名 :String)-> String { //我们naming here使用naming here 返回命名 } //当我们调用函数时,我们使用参数 introTo(参数:“交换功能”) //返回-> swift函数 正如您在上方看到的那样,为参数指定名称时,有两个单独的名称。 因此,第一个用于外部 ,这意味着您在方法外部调用函数时会使用它,第二个用于内部 ,这意味着您在方法内部使用局部变量 苹果 每个功能参数都有一个 参数标签和参数名称 。 参数标签在调用函数时使用; 每个参数都写在函数调用中,并带有其参数标签。 参数名称在功能的实现中使用。 默认情况下,参数使用其参数名称作为其参数标签。 — Swift编程语言书(Swift 4版) 因此,如果我们看一下示例: func introTo(parameter naming: String,… parameter是参数标签, naming是参数名称。 顺便说一句,所有参数必须具有唯一的名称。 但是,多个参数可以具有相同的参数标签。 为了提高可读性,最好使用唯一的参数标签。 参数标签==外部名称,参数名称==内部名称 苹果解释的最后一句话是: 默认情况下,参数使用其参数名称作为其参数标签。 让我们以示例的方式看看敏捷工程师想要说些什么; func global( firstParameter […]

本地通知样本

开始之前,如果遇到任何问题,都可以在此处下载完整的源代码项目。 您需要阅读以下所有Apple文章,才能全面了解通知。 用户通知 将面向用户的通知从服务器推送到用户的设备,或从您的应用本地生成。 要求使用通知的权限 要求用户显示通知,播放声音或标记应用程序图标的权限以响应通知。 从您的应用本地调度通知 当您想引起用户的注意时,可以从您的应用程序创建和安排通知。 完整的代码警报通知,直到现在 下面的示例将上述所有代码连接到现在: 您可以运行它,但是必须等到星期二14h才能看到此警报通知。 这不可能测试通知。 因此,我们将UNCalendarNotificationTrigger更改为UNTimeIntervalNotificationTrigger,以在接下来的10秒内显示通知,如下所示: 现在运行该应用程序,您将看到日志“请求已创建”。 您需要通过按“主页”按钮立即将应用程序移至后台,并在几秒钟后显示警报通知。 欢呼😀 声明您可行的通知类型 区分您的通知,并将操作按钮添加到通知界面。 完整的代码警报通知以及相关操作,直到现在 以下完整代码示例显示带有操作的警报通知: 现在运行并测试it 处理通知和与通知相关的操作 响应用户与系统通知界面的交互,包括处理应用程序的自定义操作。 自定义通知的外观 使用通知内容应用扩展程序自定义iOS应用的通知警报的外观。 这就是本地用户通知。 您可以在此处下载完整的源代码项目。

iOS Swift 4实时聊天功能。 火力基地

参考来源:https://www.raywenderlich.com/140836/firebase-tutorial-real-time-chat-2 Github项目:https://github.com/vin20777/Firebase-Tutorial-Real-time-Chat 首要作业:1。 请先安装Cocoapods并在目录下pod安装指令2.用Google帐号申请Firebase专案权限3.获取GoogleService-Info.plist并放置于专案中4.换上自己的存储URL 由于教程里的范例有JSQMessage已不再支持,Swift仍未更新至4,因此放上Swift 4消除警告修复版(未来也会变成legacy吧……)。 一般的架构如果要建立聊天室类型的APP,都要有前端与本身的技术支持,但是Firebase强大的整合了常用的功能,在聊天室这个情境中,与普通呼叫API不相同的点在于A君如何知道B君发送了一条消息,并且对话记录的记载,这些都在Firebase的SDK完美的封装提供给您使用了,有兴趣的可以谷歌相关技术。 如果都没碰过Firebase相关的开发者也不用太担心,可以先去看看Raywenderlich.com其他相关的Firebase教程,这个网站真的是佛心来着,大部分基础教程都可以免费阅读且记载详细又好玩喔! 本篇会遵循教学的流程来走,实际的实作或解释还是需配合教程来走喔! First Step聊天室当然是大家都可以用的啊(至少是下载我的APP嘿!),但是App仍必须识别此用户是谁,因此使用Firebase的匿名登录模式,记录用户的唯一识别码。 TableView分为两个部分,一个能够让你创建聊天室,另一个则是显示当前所有聊天室的列表。 第三步Firebase封装为观察者模式去监听实时频道(频道)是否有增删权,如有异动则调用私人功能seeChannels()或者当房主自己创立一个频道func createChannel(_ sender:AnyObject)与Firebase互动。 第四步JSQMessageViewController是一个聊天室页面的开源框架,很遗憾最近作者在2017年7月16日宣布停止维护,仍然可以使用它但是不会再去修正错误或增加功能,它通过Collection视图去当底然后封装成非常容易使用的类,我认为目前有聊天室功能的iOS应用都是参考或直接使用它再做变化。 第五步利用协议客制化好UI部分后,剩下的就是与第三步类似的文字Firebase同步问题啰,观察数据库的结构是否有异动去更新画面。 Last迄今为止已经是一个有模有样的两人文字聊天室了,可参考我的Github做搜寻,测试的话就使用真机一台和模拟器互相操作吧!如果你想要a。 发现对方是否是输入中b。 传输照片(使用Firebase存储),会发现做法都是类似的步骤:获取Firebase沟通方式->上传更新资料库或下载同步装置端资讯-> UI显示,基本上现在的聊天室都有五花八门的功能,毕竟想赚大钱不是这么容易,你可以去设想更多的功能与之结合,大家伙就4这样啰,快去创立自己的聊天室吧!

适用于初学者的Swift Optionals

如果您是初学者,尽管可能已经找到了解决方法,但是Optionals可能很难理解。 在本文中,我们将探讨Swift Optionals背后的基本原理。 在开始之前,我假设您了解Swift的基础知识。 如果没有,请关注我的YouTube视频并返回此处。 与其他编程语言相比,Swift带来的主要优势之一是Optionals。 Optionals允许您将nil值存储在变量中,这在其他语言中几乎是不可能的。 如果在变量中找到nil值,程序将立即崩溃。 但是我们可以在Swift中使用Optionals来避免这种情况。 让我们看下面的分步示例。 让我们如下创建两个变量。 如您所见, myFirstName变量是一个可选变量,因为它有一个? 在变量之后。 即使myFirstName变量为nil,您也可以打印myFirstName和myLastName而不会出现任何问题。 您几乎无法使用任何其他编程语言来执行此操作,因为该应用程序将崩溃。 让myFirstName:字符串? =无 let myLastName:String =“ Mayu” print(myFirstName)//输出nil print(myLastName)//打印Mayu 因此,现在让我们为myFirstName变量分配一些值,并查看如何打印这些值。 如下所示,可选的myFirstName变量在打印中显示它是可选的。 我们将在课程结束时学习如何摆脱它。 让myFirstName:字符串? =“杰伊” let myLastName:String =“ Mayu” print(myFirstName)//打印可选的(“ Jay”) print(myLastName)//打印Mayu 我们还应该注意,我们不能让可选变量与其他变量交互,因为它不仅会起作用。 它可以使用String类型的变量,而不会导致应用程序崩溃,但是如果尝试使用其他变量类型,它将使应用程序崩溃。 请看下面基于int数据类型的示例。 让numberOfDogs:Int = 2 让numberOfCats:Int = 1 让numberOfParrots:整数? = 4 print(numberOfDogs)//打印2 print(numberOfCats)//打印1 print(numberOfParrots)//打印4 print(numberOfCats + numberOfDogs)//打印3 print(numberOfCats […]

在Swift 4中使用JSONDecoder和Decodable的基于协议的通用网络

Swift 4已经发布了一段时间,本周(2017年12月)发布了XCode 9.2,对于Swift 4并没有太多戏剧性的更新,但是我们可以使用一些新工具来编写更简洁和可重用的代码,在本文中我们将主要关注JSONDecoder和Decodable协议,该协议有助于简化JSON的解析。 我们将创建可用于任何模型的通用API,因为我要在该项目上强调的是如何创建网络层,因此我们将仅解析JSON并将其作为模型打印在控制台中。 作为奖励,我将在该项目中添加第二部分,在该项目中,我们将使用协议扩展来使用XIBS创建UI。 对于此项目,我们将使用“电影数据库”中的API,您可以在此处查看其文档。 让我们从下载此入门项目开始,在该项目上您将找到一个名为Model的组和一个名为Networking的空组。 模型一包含两个模型,一个模型名为MovieFeedResult,具有电影类型数组的属性,另一个模型称为电影,我们将在完成网络层后重新访问这些文件。 我们将逐步创建网络层,创建一个新的Swift文件并将其命名为Result并将此枚举复制并粘贴到其中…… 枚举Result ,其中U:错误{ 成功案例(T) 案例失败(U) } 当我们发出URL请求时,我们可能会得到两种不同的响应,要么是成功的响应,要么是失败的响应。 通常,我们都会在完成处理程序设置中将两者都设为nil,但是通过此通用枚举,我们可以避免这种情况,并只传递每种情况所需的值。 接下来,我们将创建一个带有协议扩展名的协议,创建一个新文件并将其命名为Endpoint,复制并粘贴… 协议端点{ var base:字符串{get} var path:字符串{get} } 扩展端点{ var apiKey:字符串{ 返回“ api_key = 34a92f7d77a168fdcd9a46ee1863edf1” } var urlComponents:URLComponents { var components = URLComponents(string:base)! components.path =路径 components.query = apiKey 返回组件 } var request:URLRequest { 让url = urlComponents.url! 返回URLRequest(url:url) } } […]

使用ReactorKit,Quick&Nimble,RxBlocking,Swift 4.1在iOS中进行单元测试

入门 我们将使用RxBlocking来验证Reactor(ViewModel)的状态。 我们还将使用Stubber 模拟我们的网络请求。 最后,您的Podfile应该包含以下内容: def development_pods 吊舱“ ReactorKit” 吊舱“ RxSwift” 豆荚“ RxCocoa” 结束 def testing_pods pod’RxBlocking’ 吊舱“ Stubber” 豆荚“快速” Pod’Nimble’ 结束 简单的测试流程 一个简单的流程可能涉及将一个Action发送到您的Reactor并测试以下内容: 状态更新:在执行操作以验证Reactor逻辑时检查每个状态变量的更新。 执行次数:确保对网络请求和其他函数调用进行了正确的次数。 确保状态发出正确的次数。 初始设置 我将以下文件夹结构用于测试: 存根存储库:存储库是公开公共方法的结构,您可以使用这些方法通过网络请求获取数据。 存根存储库文件夹包含使用存根创建的模拟存储库。 ReactorTests:包含ViewModel / Reactor测试。 存根 使用Stubber模拟您的网络请求非常容易。 您还可以通过使用以下命令来验证存根方法的执行计数 Stubber.executions(signIn).count 单元测试 为了测试Reactor内部的逻辑,我们需要将Reactor视为黑匣子。 我将提供一个动作作为输入,并获得UI状态作为输出。 下面,我使用一些无效参数触发signIn操作,理想情况下,在Reactor中以同步方式进行验证后,理想情况下应该发出error状态。 我将使用RxBlocking阻止代码流,直到可观察到的state发出一个事件为止。 注意使用.delay()运算符。 没有它,在执行第7行的阻塞语句之前,可能会丢失一些事件。 订阅流后, state会发出一个事件,通常是应该跳过的先前状态。 skip(1)可以帮助您。 使用take(1)完成一次发射后的流。 否则,RxBlocking将永远不允许语句失败。 如果状态在5秒钟内未发出,则RxTimeoutException会引发RxTimeoutException,并且测试用例会自动失败。 提取状态后, Nimble用于验证状态变量的值是否符合期望。 在所有期望都得到验证后,流将立即处理掉。 如果有多个国家排放怎么办? […]

Xcode 10的新增功能和增强功能

大家好,我们来谈谈Xcode。 我已经使用了几天,我想是时候与大家分享我的经验了。 希望您对我感到兴奋,并记得为我按下“拍手”按钮。 谢谢❤️ 人类是作为视觉动物而诞生的,有些人可能会否认它,但这是事实。 快点承认吧。 因此,我想首先讨论外观不会感到内~~将macOS版本更新为Mojave,将Xcode更新为Xcode 10之后,您将看到这种漂亮,优雅的黑暗模式。 对于那些花了许多深夜来修复错误的人来说,这将是一个福音。 接下来,注意下图左侧的蓝色细条吗? 在Xcode 10中,当取消提交更改时,Xcode将直接显示它。 因此,当出现必须离开计算机一段时间但还没有完成工作的情况时,您可以在回到家时立即赶上离开的地方。 等等,不是。 单击该蓝色条,我们将看到一个对话框弹出,现在我们可以像Thanos一样在瞬间内放弃更改,而不必消除世界〜 现在在Xcode 10中支持Bitbucket,嗯……实际上并没有太大的改变,特别是对于那些熟悉源代码控制的人。 此外,不难理解如何进行源代码控制。 但这总比没有好。 下一步,当从存储库中提取Xcode 10时,现在可以为本地更改建立基础。 拉动时,只需选中下面的复选框。 一项不错的更改,为用户简化了许多步骤,并使刚开始学习源代码控制的人员变得更容易。 Xcode中的库是什么? 许多人可能不会注意到库的存在,因为它是在Xcode 10之前内置在检查器中的 ,这具有方便的优点,但也有使检查器区域显得拥挤的缺点。 现在在Xcode 10中,Apple将库与检查器分离,并为此建立了一个个人按钮。 因此, 检查员看上去更整洁,并且无需让检查员缩小您的编码区域。 Xcode的一项新功能实际上是使您的代码看起来更整洁,它可以折叠括号内的所有代码块。 例如,如果您百分百确定代码的这一部分是正确的,并且不打算在短时间内将其折叠就可以对其进行更改,那么对于其余的代码则更容易调试(要启用此代码,请转到Xcode→首选项→文本编辑→显示→检查代码折叠功能区) 此功能的新外观。 更容易找到重命名的内容和位置,它会自动找到项目中的所有变量,如果您不想更改某些内容,只需取消选中文件前面的复选框即可。 在我看来,这是Xcode 10中最好的更改。它将最后一行代码滚动到中心,当我们只想腾出一些空间来简化代码编写时,就不必像疯子一样轻敲键盘上的Enter键。 。 专为机器学习打造的游乐场 类似于REPL的新模型可立即重新运行现有的游乐场代码。 将您的代码运行到任何特定行,或者键入shift-return来运行刚添加的代码。 导入Create ML框架以交互方式训练新模型,然后编写代码以在操场上测试模型。 完成后,将模型拖到您的应用中。 测试与调试 从新设备下载调试符号的速度是以前的五倍。 Xcode将产生一组相同的模拟器,以利用您的多核Mac,并进行风扇测试以并行运行,从而使您的测试套件更快地完成了许多次。 以随机或线性顺序运行测试。 仪器会自动显示您添加到代码中的OSLog路标。 构建并共享您自己的自定义工具包,以为您自己的代码提供独特的数据可视化和分析。 内存调试器使用紧凑的布局,可以更轻松地调查您的内存图。 金属着色器调试器使您可以轻松检查顶点,片段,计算和切片着色器代码的执行。 金属依赖性查看器提供了有关在基于金属的应用程序中如何使用资源的详细图表。 建立绩效 默认情况下启用新的构建系统,并在整个过程中提高性能。 […]

国际化和本地化

本地化是将您的应用翻译成多种语言的过程。 但是在本地化您的应用程序之前,先对其进行国际化。 国际化是使您的应用程序能够适应不同语言,地区和文化的过程。 由于一种语言可以在世界的许多地方使用,因此您的应用应适应一个人居住的地区和文化习俗。 在国际化的应用程序看来,它似乎是它支持的所有语言和地区的本地应用程序。 App Store遍布150多个国家/地区,而将您的应用程序国际化是进入这一全球市场的第一步。 在App Store Connect中,指定您的应用在所有地区还是特定地区都可用。 然后,您可以为要支持的每个目标市场定制应用程序。 其他国家/地区的用户希望以他们理解的语言来使用您的应用,并以熟悉的区域格式查看日期,时间和数字。 这只是有关内部化和本地化的概述。 有关更多信息,我建议阅读Apple的所有文档。 阅读文档很无聊,但是它可以帮助您扩展编程知识的头脑。 如果您想跳入代码,则可以观看以下视频: 该视频包含以下本地化功能: 在情节提要中本地化UI控件。 通过使用代码本地化字符串。 本地化日期时间。 本地化数字。 本地化名词复数。 首先,您需要在此处下载该入门项目,以按照视频中的指南进行操作。 如果遇到任何问题,都可以在此处下载完整的项目。 祝好运!

掌握CoreData(第4部分,面向核心数据对象的CRUD)

为了使用面向对象的方式演示核心数据的基础,让我们使用之前的项目,使其以面向对象的方式执行CRUD操作,因为我们需要将NSManagedObject子类化。 请按照以下步骤使用Xcode创建Core Data管理的对象子类: 在项目导航器中选择您的Core Data模型。Xcode在编辑器区域的大纲视图中显示所有实体。 在大纲视图中选择一个实体,然后验证是否在Data Model检查器中将Codegen弹出菜单设置为Manual / None,如图1所示。对于要创建Core Data受管对象子类的所有实体,请重复此步骤。 由于我们只有一个实体任务,因此我们在任务实体上执行了此任务。 选择Editor> Create NSManagedObject Subclass…,如图2所示。 在显示的工作表中,选择包含您的实体的数据模型,然后单击“下一步”。 图3从列表中选择数据模型。 在出现的工作表中,选择要创建其Core Data托管对象子类的实体,然后单击“下一步”。 图4从列表中选择您的实体。 在出现的工作表中,选择一个保存文件的位置,然后单击Create,如图5所示。 Xcode在所选位置为每个所选实体创建并保存名为ClassName + CoreDataClass和ClassName + CoreDataProperties的文件,其中ClassName是实体的NSManagedObject子类的名称。 ClassName + CoreDataClass实现NSManagedObject子类,如图6所示。 ClassName + CoreDataProperties实现ClassName + CoreDataClass扩展(对于Swift应用程序)或类别(对于Objective-C应用程序),如图7所示。 以面向对象的样式创建记录到核心数据 以面向对象的样式从核心数据中获取记录 从面向对象样式的核心数据中删除记录 摘要 我们只是以对象样式的方式完成了CRUD操作。 正如我们在第1部分中所述。 核心数据以一种看起来非常面向对象的方式存储我们的代码。 实体是指类,属性是指var,关系是指var指向其他类 接下来是什么? 在下一部分中,我们将讨论实体之间的关系。 有用的链接 https://store.raywenderlich.com/products/core-data-by-tutorials https://www.objc.io/issues/4-core-data/core-data-overview/ https://zh.wikipedia.org/wiki/Object-relational_mapping https://cocoacasts.com/what-are-core-data-entities-and-attributes https://cocoacasts.com/what-is-the-core-data-stack https://developer.apple.com/library/archive/documentation/DataManagement/Devpedia-CoreData/coreDataStack.html https://medium.com/@ankurvekariya/core-data-crud-with-swift-4-2-for-beginners-40efe4e7d1cc https://www.raywenderlich.com/7569-getting-started-with-core-data-tutorial https://developer.apple.com/library/archive/qa/qa1952/_index.html