Tag: Swift 4

通过快速使用代码生成来快速创建模型

大家好! 今天,我们将学习如何停止编写样板代码。 创建某些模型时,我们总是会编写相同的代码。 假设我们有一个地方,那里有ID,名称和位置。 所以我们的结构看起来像这样: 然后,当您“构建”项目时,sourcery将为所有模板生成代码。 您可以在此处找到其他安装方法:https://github.com/krzysztofzablocki/Sourcery#installation 配置文件 让我们在xcode项目中创建名称为“ Templates”的新文件夹,我们的模型应该在名称为“ Models”的文件夹中。 现在我们需要在项目文件夹中创建“ .sourcery.yml”文件。 并写成这样: 您必须用项目名称(文件夹名称)替换“ ProjectName”,这是从“ .sourcery.yml”文件到我们的模型文件夹和模板的路径。 在此处阅读有关此配置文件的更多信息。 代码生成 因此,现在所有人都可以生成代码了。 我们只需要创建一个模板。 让我们创建一个简单的“ JSONAutoRepresentable”协议: 在我们最近创建的Templates文件夹中,创建文件“ JSONRepresentable.stencil” 好的,现在我们需要编写模板。 我们该怎么办? 我们必须遍历实现协议的所有类: 2.我们的模型可以包含一些变量,这些变量不是来自服务器的。 在这种情况下,我们可以为此变量添加注释:“ // sourcery:skip”,然后我们必须遍历所有没有跳过注释的变量: 3.在某些情况下,我们可以使用不同的变量名称和json键。 在这种情况下,我们可以使用“ // sourcery:jsonKey =” JSONKey””标记该变量。 然后: 4.如果变量是Array,那么我们需要映射到elementsTypes(并且需要将驼峰大小写转换为蛇形大小写。): 5.如果该变量也是JSONAutoRepresenteable: 6.如果变量是枚举: 7.对于所有其他变量: 完整的JSONRepresentable.stencil文件可在以下位置找到: https://gist.github.com/Banck/0aa2d992173f972999772cda768929f5 因此,现在我们可以将JSONAutoRepresentable协议添加到我们的Place模型并构建项目。 结果如下: 这是带有跳过注释和jsonKey的模型的示例: 您可以在此处阅读有关模板的更多信息: https://cdn.rawgit.com/krzysztofzablocki/Sourcery/master/docs/writing-templates.html 希望本文对您有所帮助。 ✌️

Swift4秘诀:如何以更好的方式处理序列标识符

func navigationToShowDetailController(){ self.performSegue(withIdentifier:“ showDetail”,发送者:nil) } //标记:-Seguesoverride func prepare(用于segue:UIStoryboardSegue,发件人:任意?){ 如果segue.identifier ==“ showDetail” { 如果让indexPath = tableView.indexPathForSelectedRow { 让object = objects [indexPath.row]为! NSDate 让controller =(segue.destination as!UINavigationController).topViewController as! DetailViewController controller.detailItem =对象 controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem controller.navigationItem.leftItemsSupplementBackButton = true } } } 由于我们使用字符串作为segue标识符,因此无需进行编译时检查,而且输入错误可能导致运行时崩溃。 此代码也很难推理。 例如,如果您错过了prepare(for:sender:)的segue标识符检查,会发生什么情况 当代码中存在多个问题时,情况将变得更加糟糕。 解决方案:将segue标识符定义为枚举,并享受强大的数据类型带来的所有好处。 枚举SegueIndentifier:字符串{ case showDetail =“ showDetail” } //标记:-Seguesoverride func prepare(用于segue:UIStoryboardSegue,发件人:任意?){ 警卫队让identString = segue.identifier,让标识符= SegueIdentifier(rawValue:identString)else […]

Swift 4 Introduction系列1.2 — Swift变量和常量

与其他编程语言类似,Swift也使用常量和变量。 常量是一个名称/标签,用于引用不会随时间变化的所选数据。 常量只能声明和分配一次。 不能在同一程序中重新声明或重新分配它。 但是我们可以多次引用常量。 变量是一个名称/标签,用于引用可能随时间变化的所选数据。 只要重新分配的数据与声明的数据类型相同,我们就可以将其他数据重新分配给该变量。 变量只能在程序中声明一次。 不能在同一程序中重新声明。 Swift的3种基本数据类型是: 字符串表示文本,整数表示整数, 双精度表示浮点数。 Swift鼓励我们使用上述基本数据类型来实现更好的互操作性。 另外,对于无符号整数,我们有UInt ;对于较小的浮点数,我们有Float 。 仅在必要时使用UInt和Float。 除了String之外,我们还具有称为Character的数据类型。 这是一个包含单个字符的数据类型。 最后,我们为布尔值存储了布尔值,布尔值仅存储True或False。 我们使用以下语法声明了常量: 让 = 常量的基本规则: 必须在使用前声明一个常量。 常量只能声明为ONCE 。 声明常量后,就无法在同一程序中再次声明具有相同名称的常量。 常量只能分配一次 。 一旦分配了常数,就无法将其与其他数据一起重新分配。 常量的命名必须遵循命名规则。 在Swift中,建议我们尽可能多地使用常量。 这是为了使代码更安全。 例: 让someString =“这是一个测试” let someNumber = 18273 在上面的示例中,当我们使用值声明常量时,我​​们不需要定义数据类型。 系统将从我们提供的值中推断出数据类型。 通过使用逗号分隔变量,我们可以在单个语句中声明具有多种数据类型的多个变量。 但是,常量和变量不能在同一语句中使用。 例: 设fixed1 = 2837,fixed2 = 7238,fixed3 = 8320,fixed1 固定2 固定3 […]

使用Socket.IO和MySQL和Node.js在iOS Swift 4中进行实时更新

在线上的许多示例演示了实时聊天室的强大功能。 虽然这是Socket.IO的绝佳应用程序,但是当通过API更改数据时,我们也可以使用Socket.IO来向Web或移动应用程序发出信号以进行更新。 如果您正在寻找一种使用关系数据库的解决方案,而该数据库不是太抽象,而是可以提供更大的灵活性,那么它可以是Realm或Firebase之类的绝佳选择。 在此示例中,我们将开发一个简单的iOS Swift 4应用程序,当通过简单的API在我们的关系数据库中更改数据时,该通知将得到通知。 可以在这里找到所有服务器和iOS代码: https : //github.com/smifsud/realtime 这些是我们将要执行的步骤: 创建带有一些示例内容的本地Node和MySQL服务器。 在Node.js中创建一个简单的API,该API将接受用户标识符(令牌)并返回关联的数据 通过存储在数组中*捕获服务器上的客户端令牌和套接字ID * 更新表API。 当发生任何变化时。 属于该新闻组的所有已连接令牌将通过带有唯一名称空间(令牌),socketID和事件名称的消息发出通知 iOS更新。 捕获事件并更新应用。 在我们的假设应用程序中,有新闻组,某些用户可以访问其中包含来自不同新闻媒体的标题的新闻组。 在我们的iOS应用中,我们将有一个包含相关标题的UITableView。 通过我们的简单API进行更改时,服务器端功能将检查服务器以查找与更改后的数据之间的关系,如果存在实时连接(socket.IO连接),服务器将向该特定对象发出事件客户端连接和与用户ID关联的用户令牌。 *在我们的示例中,我们将要注意套接字ID。 我发现许多教程都没有提到这一点,但是应该考虑到这一点。 例如,当使用诸如socket.on Any之类的命令时,即使没有订阅特定的应用程序,应用程序仍然可以拾取通过网络发出的消息。 除了指定名称空间之外,我们还希望指定套接字的IO ID ,以便在调用过程中有效地发送一条消息,并确保并非每个客户端在传输可能会传输的任何活动期间都收到ping。与我们的特定用户无关。

Swift 100天:项目6 –将数据传递给另一个

环境:Swift 4 /日期:6 /日期:2017年10月22日/时间:1小时 我学到什么: ・ Segue:将数据传递给另一个视图控制器 ・隐藏式键盘 ・导航项目 Github原始码:这里 小知识: 1.导航项: 我的情节提要,主要由导航控制器,连接着第一视图,再由完成连接到第二视图。但是如果少做下面这个步骤,便会无法添加标题,也只会有<返回,而不是<第一视图。 导航栏连结方法:在Second View中添加一个“ Navigation item”,即能替这页面加上Title&Custom back button。 2.关闭键盘 如何「点击画面其他位置,可以把键盘收起来」? 扩展ViewController {func hideKeyboardWhenTappedAround(){ 让我们点击:UITapGestureRecognizer = UITapGestureRecognizer(目标:自我,行动​​:#selector(dismissKeyboard)) view.addGestureRecognizer(点击) } @objc func dismissKeyboard(){ view.endEditing(true) } } 这是已更新至Swift 4的版本,只要替代特定的viewcontroller加载以上extension,并在viewDidLoad中加上这一小行即可: self.hideKeyboardWhenTappedAround() 心得: 习惯之始,如蛛丝,习惯之后,如绳索。 迈入第六天,似乎已成习惯,写起来不那么别扭,一边当成日记纪录此刻心情。 小时候,老师总会叫我们写日记,认为是练字,练文笔,练口才,当时可能还没那么多未来展望,工作规划,人生期许这种样的压力,顶多是风花雪月贺尔蒙作祟的矫情。 但为什么长大后,越来越少人有写作的习惯呢? 褪去求学时期的蒙懂,添重旁人期待的负载,有别儿时的练习,如今更是心情抒发与自我观察的良帖。 一个人要成长,而不是专业上,抑或心灵上,适时回头观望自己的人生是怎么走过来的,未来又应该往哪里去,似乎是必经之路,也可能是转捩点的开端。 在自我观察的同时,我经常给自己极大的期许,振奋的精神喊话,谱出美好的未来,我相信只要做对的事,骐骥一跃,不能十步;驽马十驾,功在不舍,一步一步,最终会达到心中的高度。 看着镜子中的狮子,即使小猫,也拥有如狮子般高亢的自信与勇气!

Swift 4.2中的网络

介绍 好吧,这里通常会花很多时间谈论移动应用程序中网络层的重要性,每个人都知道! 因此,让我们谈谈更重要的事情,如何以可重复使用的方式组织这些事情,而无需一次又一次地重新实现它。 让我们保持简短,着手做生意。 在本教程中,我将分享在POP方法中结合使用可编码的 泛型的经验。 我们将在这里做什么 首先:我们将创建一个请求类型 然后:我们将处理错误类型 下一步:我们将实现一种执行方法并以通用方式映射它 让我们不要忘记整理结果 最后:我们使用请求者类型执行它 请求类型 该对象将封装HTTP调用详细信息: 。 标头 :是HTTP请求和响应的组成部分,通常包含令牌,登录详细信息… 。 参数 :这些是HTTP调用的查询详细信息,将以“ http://……?key = value&key = value”的形式显示 。 BodyParameters:将保存将发送到后端的所有数据。 。 HTTPMethod :GET,POST,PUT … 让我们从编写一些代码开始! 首先,最简单的事情是定义HTTP方法。 现在我们有了方法,我们将为params,header和bodyParams创建typealias。 然后: –我们将创建我们的请求协议 –我们将使用协议扩展为其添加默认行为 –最后,我们创建实现该协议的HTTPRequest结构 繁荣! 而已。 错误类型 这种类型将组织我们层中的错误! 为了更好地处理它。 我们有不同类型的错误: 。 网址错误:网址无效时。 。 数据错误:数据为零时。 。 mappingError:将数据映射到可编码对象失败。 响应错误:当我们在执行请求时收到错误时,我们将为此使用泛型,并在枚举的情况下传递错误值,这是很酷的事情! 让我们开始吧! 一块蛋糕! 错误类型使用通用类型E,以后将是快速错误类型。 结果类型 […]

如何在iPhone和iPad上呈现UIActivityViewController

呈现UIActivityViewController来共享iOS应用程序中的项目是一项非常简单的任务。 让activityVC = UIActivityViewController(activityItems:[“要共享的字符串”],applicationActivity:nil)present(activityVC,动画:true,完成:nil) 呈现UIActivityViewContoller模态在iPhone上效果很好: 但是,这会导致iPad崩溃: ***由于未捕获的异常“ NSGenericException”而终止应用程序,原因:“您的应用程序已呈现UIActivityViewController()。 在其当前特征环境中,具有此样式的UIActivityViewController的modalPresentationStyle为UIModalPresentationPopover。 您必须通过视图控制器的popoverPresentationController提供此弹出窗口的位置信息。 您必须提供sourceView和sourceRect或barButtonItem。 如果在显示视图控制器时不知道此信息,则可以在UIPopoverPresentationControllerDelegate方法-prepareForPopoverPresentation中提供它。 该错误信息不言自明。 UIActivityViewController在iPad上的弹出窗口中显示。 甚至文档都提到了这一点 在iPad上,必须在弹出窗口中显示视图控制器。 因此,在iPad上,您必须通过提供sourceView和sourceRect或barButtonItem来配置popoverPresentationController。 让activityVC = UIActivityViewController(activityItems:[“要共享的字符串”],applicationActivity:nil)present(activityVC,动画:true,完成:nil) 如果让popOver = activityVC.popoverPresentationController { popOver.sourceView = self.view //popOver.sourceRect = //popOver.barButtonItem }

iPhone尺寸等级

尺寸类别可让您对屏幕的宽度和高度进行分类,并根据这些组合设置条件。 例如,您可以确定化身在具有紧凑宽度的屏幕上为30 x 30 pt ,但在具有常规宽度的屏幕上为50 x 50 pt ,这仅仅是因为较大的屏幕上有更多的空白空间。 由于纵向和横向之间或iPhone和iPad之间的版式可能完全不同,因此尺寸类对于自定义版式超出常规的“自动版式”约束至关重要。 宽度和高度共有3种大小类别: Compact , Regular和Any 。 通过组合这些,您将同时影响多个设备。 例如, 紧凑型 (宽)x 常规型 (高)将以纵向模式定位所有iPhone,但不会影响横向或iPad。 有趣的是,即使屏幕的宽度很大, Compact x Compact也会影响风景中的iPhone(iPhone 6 +,7 +,8 +除外)。 因此,重要的是要熟悉不同的组合,如下图所示。 归功于: www.designcode.io

在Swift-4中玩闭包(第-1部分)

根据快速的编程语言 闭包是可以独立传递的功能块,可以在代码中传递和使用。 Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambda。 简单来说,闭包是没有名称的函数,它们只是从定义它们的上下文中捕获并存储对任何常量和变量的引用。 这称为关闭这些常量和变量。 闭包表达式语法 {(参数)->返回类型 陈述 } 让我们从一个简单的闭合开始,它打印一条消息 在上面的示例中,创建了一个简单的闭包并分配给myfirstClosure 。我们也可以说创建了一个没有名称的函数,我们可以像普通函数一样调用它。 myfirstClosure() 带参数的闭包 闭包可以接受参数。要使闭包接受参数,我们必须在括号内列出它们,然后我们必须在 关键字中编写 这样,闭包主体就可以在此之后启动。带参数的闭包示例如下。 让myfirstClosure = {(withParameter:String)在 打印(“最后,我用\(withParameter)创建了我的第一个闭包”) } myfirstClosure(“ firstparameters”) 而输出将是 最后,我用firstparameters创建了我的第一个Closure 具有返回值类型的闭包 闭包也可以返回值。因此,要使闭包返回值,我们需要对闭包进行少量修改,例如Syntax。在括号中列出参数后,我们必须编写-> datatype,然后输入In Keyword,最后使用return像普通函数一样。示例如下。 闭包作为参数:- 我们也可以像函数的参数一样传递闭包,就像我们将字符串或整数作为函数的参数传递一样。但是这样做时,我们在语法上要做的事情很少。在函数内部定义每个参数类型时,当闭包用作函数内的参数时,如果我们什么都不返回,则需要将闭包(参数)类型指定为()-> datatype ,我们可以简单地将语法更改为()-> Void。 这里的void什么都没有。示例定义如下 导入UIKit 让闭包= { 打印(“我是一个简单的封闭者”) } func simplefunctionWithClosures(closure:()-> Void){ 打印(“要求关闭”) 关闭() print(“ Closure被调用,用作函数的参数”) } simplefunctionWithClosures(关闭:关闭) 输出在这里 尾随闭包 当我们需要将闭包表达式作为函数的最终参数传递给函数且闭包表达式过长时,将其写为尾随闭包可能会很有用。尾随闭包会在函数调用的括号后编写,即使它仍然存在函数的参数。当使用尾随闭包语法时,我们不会在函数调用的过程中编写闭包的参数标签。这是swift官方文档所说的。 我们将在本文中讨论更多有关此的内容。

Swift 100 Days:Project 22 –通过“协议”和“委派”传递数据

环境:Swift 4 /日期:79〜84 /日期:2018年1月8日/时间:2小时 我学到什么: ・研究方法 :在Swift中的视图控制器之间传递数据(扩展) ・尝试4.通过委托传回数据 ・使用协议,玩得开心!!! 小知识: 传值 , Pass Data这档事 ,无论是View Controllers之间,还是View Controller跟Model之间,都是每天都会处理到的问题。处理起来不困难,但背后的理论微庞大且广泛(好像每个概念都是如此😜)。以下推荐给大家几个资源: 传递数据: iOS:将数据从模型传递到控制器的三种方法 在iOS Project中采用MVC medium.com 如何:在Swift中的视图控制器之间传递数据(扩展) 撰写者:Reinder de Vries,2017年7月19日,在App Development中当您的应用程序具有多个用户界面时,您需要… Learnappmaking.com 协议和委托: Swift 3中的协议简介 一旦这对您有意义。 很美丽。 medium.com 在Swift中通过委托传递数据 0至100实际快速项目示例 medium.com 心得: Kobe,是我一直以来最爱的球星,偏执,追求完美,有一点的古怪,难以相处,但就是那唯我独尊的态度,引导了他的传奇之路。 人们来来去去。 传说仍然存在。