当请求完成其过程并且业务逻辑已完成与数据的处理/交互时,要求调用HTTPResponse的.completed()函数。 调用它将确保所有未决数据都传递到客户端,并且已建立的TCP连接将被关闭,或者在HTTP保持活动的情况下,将读取并处理新请求。 HTTPResponse对象公开的可用方法在将响应返回给调用方时很有用。 请记住,在我们之前的指南“使用表单数据”之一中,我们已经使用了一种方法-.appendBody(string:String)-该方法只是在响应正文中添加普通字符串,并且当.completed( )方法被调用,应用将其返回给调用者。 让我们看一下HTTPResponse公开的最常用的方法… .addHeader(名称:HTTPResponseHeader.Name,值:字符串) 通常用于添加与我们返回给调用方的内容相匹配的自定义标头。 因为我们正在构建的应该是一个API,所以您的响应将包含一种类型,仅一种类型是application / json或JSON-但这只是您可以返回的标头类型的一个示例,列表确实很长。 response.addHeader(.contentType,值:“ application / json”) 例如,您可以设置的另一种标头类型是.contentEncoding,它将告诉调用方您要返回的数据具有的编码类型。 .setBody() 调用时,此方法有几个选项。 您可以使用简单的字符串.setBody(string:String)设置响应的正文, 您可以使用[String:Any]类型的对象进行设置,并使用.setBody(json:[String:Any])将方法将该对象编码为JSON字符串, 您还可以根据需要使用.setBody(bytes:[UInt8])设置原始正文字节。 下一个与setBody一起工作… .appendBody() 这会将更多数据附加到已设置的正文内容中。 实际上,在使用appendBody之前,您实际上不需要调用setBody。 .appendBody在调用时有两个选择…… 使用.appendBody(string:String)附加一个简单的字符串,或者 像上面一样,通过调用.appendBody(bytes:[UInt8])追加原始字节 处理API时,另一种有用且最常用的方法是… 。状态 当您成功地将数据返回给呼叫者时,以及必须告诉呼叫者该操作以错误结束时,响应状态起着重要的作用。 如果我们看一下.status的基础代码,我们会注意到它的类型是HTTPResponseStatus,并且进一步研究这个类型,我们将看到大量的响应代码。 不要惊慌,当您每天使用响应代码时,您会几乎完全了解它们。 让我们将500内部服务器错误状态代码设置回我们的呼叫者 response.status = HTTPResponseStatus.internalServerError 如果我们查看一个设置了此状态的curl请求,我们将看到 <HTTP / 1.1 500内部服务器错误 <内容类型:application / json <连接:保持活动 <内容长度:0 HTTPResponse主体还有许多其他可用的方法,我鼓励您尝试一下,如果需要更多详细信息,请参阅Perfect的HTTPResponse官方文档。 让我们在我们的应用程序中测试其中一些方法。 还记得我们所期望的路由firstName , lastName和emailAddress参数吗? 当我们第一次为该路由编写逻辑时,我们将返回一个简单的字符串,让调用者知道我们已收到参数-让我们将其更改为返回JSON字符串。 良好做法提示 在创建或重构任何代码段时,始终建议您在着手编写代码之前列出您需要完成的所有任务-您可以在该函数内使用带注释的行,并且可以在每个注释下键入该任务的代码 […]
在这里,我们安装了带有Raspbian和Swift 3.0的Raspberry Pi。 现在,我们实际上可以对其进行处理。 就像闪烁不发光的LED一样。 但是,嘿,我们必须从某个地方开始… 步骤1:了解GPIO引脚号 核心概念是板上并非所有可用的引脚都是GPIO(通用输入/输出)。 有些是电源,有些是接地,有些是其他东西 。 圆圈内的数字是图钉号 。 这些引脚中的一些与GPIO引脚匹配。 例如, 引脚7与GPIO4引脚匹配。 我们只能控制GPIO引脚,而不能控制其他引脚。 其他的用来给电路加电或做其他事情 。 步骤2:连接电路 我们想创建一个简单的电路,其中通过GPIO4(引脚7)打开LED。 因此,我们创建了一个简单的电路,如下所示: 步骤3:确保我们可以在GPIO引脚上实际设置一个值 我们正在安装一个软件包,该软件包允许我们从命令行在引脚上设置值。 只是为了确保我们实际上能够将GPIO值调高和调低。 须藤apt-get installconnectionpi 现在,将引脚7设置为输出,然后将其关闭,然后再打开然后再次关闭: gpio模式7出 gpio写7 0 gpio写7 1 gpio写7 0 它应该工作。 如果没有,那么很可能是您的电路中出现了一些接线错误。 步骤4:使用SwiftyGPIO库控制GPIO引脚 Uraimo在GPIO引脚周围创建了一个非常漂亮的Swift包装器,因此我们可以在Swift应用中对其进行控制。 几乎没有什么可以做得更好的(例如,不同的GPIO类型的更多面向协议的表示,GPIO状态的更好表示以及GPIO表示的更多不变性),但这仍然是一个很好的起点。 由于Swift软件包管理器迄今为止在Raspbian上仍无法正常工作(2016年7月8日),因此我们将克隆git repo并直接在代码中使用该文件。 重要的一点是将所有源文件放在一个文件夹中,以便能够用一个简单的命令将它们全部编译。 mkdir〜/ ledtest mkdir〜/ ledtest /来源 cd〜/ ledtest git clone https://github.com/uraimo/SwiftyGPIO.git cp SwiftyGPIO / […]
什么是功能? 函数是完成特定任务的自包含代码模块。 函数是一种过程或例程。 Swift中的每个函数都有一个类型,由该函数的参数类型和返回类型组成。 什么? 它基本上是一个模块,它接受输入(参数),对其进行处理并给出输出。 我们为什么需要它们? 我的意思是,您也可以不做这些事情,但是。 使您的代码看起来漂亮和简单可能非常有用。 哇! 您得到了输出,但仅设想使用100个不同的值即可完成输出。 您的代码看起来很讨厌。 相反,您可以执行此操作。 哇! 种类 1.不带参数的功能 不需要参数。 2.具有多个参数的功能 函数可以具有多个参数。 这取决于您的要求。 3.没有返回值的函数 同样,如果函数不返回值也可以。 在某些情况下,您仅需要输入而又不希望函数返回任何内容。 4.具有多个返回值的函数 您可以使用元组类型作为函数的返回类型以返回多个。 5.可选的元组返回类型 元组可能没有价值,这也可能发生。 因此,在这种情况下,您应该返回一个可选的元组。 6.功能参数标签和参数名称 函数参数同时具有参数标签和参数名称 。 参数标签在调用函数时使用,并且可以在其前面带有标签。 您可以指定参数标签。 7.省略参数标签 您也可以省略标签。 有时很明显,在调用函数时不需要标签。 8.默认参数值 这是一个非常有用的功能。 您可以为参数设置默认值。 现在,即使您不传递值,该函数也会使用默认值。 9.可变参数 可变参数用于指定该参数可以具有多个值。 10.进出参数 试想一下,您希望变量被函数更改。 你刚刚说什么? 让我给你举个例子。 让我告诉你这里发生了什么。 现在,存在一个可变的总和,并且每次添加时都需要对其进行更新。 现在,有一种更好的方法可以做到这一点。 当您将变量(&)作为参数传入和传出参数时,应将“&”号直接放在变量名之前。 这是规则。 11.函数类型 每个函数都有一个特定的函数类型 ,由函数的参数类型和返回类型组成。 该函数是()-> […]
是的,我的第一个Pod可供所有人使用。 Jelly 1.0 ,这是一个非常易于使用的Viewcontroller-Transition-Animation框架。 无需创建自己的Presentation-Controllers或Animator-Object即可实现精美而丰富的转换。 果冻将为您完成繁重的工作。 我一直想拥有一个公共的Github存储库,其他人可以为它做贡献,我发现自己一遍又一遍地编写自定义的Viewcontroller-Transition-Code 。 因此,为此创建一个易于使用的Pod并不是一个好主意吗? 这是关于我如何创建Jelly 1.0的故事,包括我遇到的所有问题以及找到的解决方案和工具。 塞巴斯蒂安·博尔特/果冻 Jelly仅需几行代码即可在iOS中提供自定义视图控制器转换 💪github.com 脚手架🛠 直到我开始构建Jelly 1.0为止 我与其他人创建的Pod一起工作了很多,但我从来没有一个人建造过。 因此,我开始仔细研究如何生成一个。 使用pod lib创建工作区create [NAME] 是我做的第一件事。 pod lib创建果冻 该命令创建了我入门所需的一切。 我只需要回答一些有关我使用哪种语言,想要包括哪些测试框架的问题。 您要使用哪种语言? [Swift / ObjC] >斯威夫特 您想在您的媒体库中包含一个演示应用程序吗? [是/否] >是的 您将使用哪些测试框架? [快速/无] >快速 您想进行基于视图的测试吗? [是/否] >否 在CocoaPods为我创建了一个脚手架之后,我立即打开了工作区文件并进行了Xcode 用典型的Swift 3转换对话框提示我。 因此,出于某种原因,似乎Cocoapods模板尚未准备好Swift 3。 我自己转换了代码并尝试构建Project,但是如您所见,它不起作用。 出现错误❗️ 我知道这个 ! Xcode需要为每个目标设置SWIFT_VERSION 。 因此,我在Podfile中添加了安装后阶段,该阶段可以为我完成工作。 post_install做|安装程序| installer.pods_project.targets.each做| […]
(在GitHub上构建Swift 3.0) Swift公开了图形程序员从C ++等语言中缺少的一些广受欢迎的功能,在C ++中,大多数游戏引擎都是在其中编程的。游戏引擎当然会大量使用矩阵,因此我们全面介绍了Swift。 矩阵是具有表格数据的对象,因此就属性而言,我们有两个主要方面:数据和维度,如宽度和高度。 我们将从创建一个实现CustomStringConvertible的新类开始。 这是允许对象成为对象的公共协议。 类矩阵:CustomStringConvertible { 内部var数据:Array var行:Int var栏:Int init(_ data:Array ,rows:Int,columns:Int){ self.data =数据 self.rows =行 self.columns =列 } init(rows:Int,column:Int){ self.data = [Double](重复:0.0,计数:行*列) self.rows =行 self.columns =列 } } 存取资料 我们传递的数组是一维的,我们可以假设有一个二维数组,其中将包含行和列属性作为其结构的一部分。 但是,在对此进行编码时,我发现仅传递标准数组并分别指示矩阵的形状会更容易。 这也是像numpy这样写得很好的库当前正在使用的方法。 另一个初始化程序将创建一个充满0.0值的矩阵。 下标(row:Int,col:Int)-> Double { 得到{ 返回数据[(行*列)+ col] } 设置{ self.data [(行*列)+ col] = newValue } } 将其数据保存在一维数组中意味着我们需要手动计算索引,但这是一个很小的代价,因为我们只需要执行一次即可。 之后,我们可以按以下方式访问数据: […]
intราบสวัสดีพ่อแม่พี่น้องที่หลงเข้ามาอาาบทควนมแามแรกของผมด้วยนะครับในี้เนนจะมราจะมาพูดถึง กันแล้วถ้างั้นเรามาเริ่มกันเลยย〜 ขอยกคำพูดของเจ้าของบทความมาเลยละกันนะครับ Lintคือ静态代码分析เป็นเครื่rank Linามารถอ่านเพิ่มเติมได้ที่Linารู้จักกับAndroid Lint — Jedsada Tiwongvorakul 危险危险危险危险危险危险危险危险危险危险 危险会在您的CI之后发生,从而使您的团队围绕代码审查的惯例自动化。 这提供了流程中的另一个逻辑步骤,通过此Danger可以帮助您减少日常代码检查中的死记硬背任务。 您可以使用“危险”来整理团队的规范,让人们去思考更棘手的问题。 เอาเป็นว่าขอสรุปตามความเข้าใจของตัวเองก็แล้วกันนะครับ 危险危险危险危险危险 危险皮棉皮棉布好酷〜 lanรับคนที่ใช้fastlane(CI / CD工具)ในับคารทำงานอยู่แล้ว emนส่วนของ Gemfile เป็นไฟล์ที่ใช้สำหรับบอก依赖版本เช่นLibrary,Ruby包ในภาษาRubyที่เราต้องการใช้ในโปรเจคของเราให้ทำการเพิ่มgem’danger gem ‘danger’ 危险工具และgem’danger gem ‘danger-checkstyle_format’, ‘~> 0.1.1′ pluginน插件ของ危险工具ที่ใช้สำหรับการอ่านไฟล์Reportกคำสั่งากคำสั่งswiftlintในfastlaneเพื่อเอาผลลัพธ์ที่ได้ไปCommentแบบ内联代码บนGitHubนนเอง ถามารถ复制代码Textอย่างด้านล่างไปใส่ในTextEditor(เช่นSublime)แล้ว保存เป็น Gemfile Gemfileได้เลยย〜 ตัวอย่างGemfile 来源“ https://rubygems.org” 宝石’危险’ gem’danger-checkstyle_format’,’〜> 0.1.1′ fileนส่วนของ Fastfile เป็นไฟล์ที่ใช้สำหรับสร้ร้างขั้นตอนการทำงาน Fastfile ให้กับส งอย่างFastfile fastlane_version“ 2.3.12” default_platform:iosEncoding.default_external =编码:: UTF_8 Encoding.default_internal =编码:: UTF_8 平台:ios dobefore_all做 […]
我最近在构建macOS应用时遇到了动画问题。 我无法正确显示转换后的图层。 事情变得很时髦。 因此,我决定花一些时间再次阅读文档。 它带给我以下几点: 查看编程指南 核心动画编程指南 他们有这样的关系: NSView位于AppKit Framework内部,它可以成为层支持的视图,并添加硬件支持以渲染图形。 重要学习 使用CALayer后,视觉效果将由硬件渲染。 也就是说,纯NSView由CPU处理 与UIView相比,NSView具有翻转的坐标系。 NSView中的点(0,0)指向左下角 AppKit和NSView无法提供简单的方法来制作内容动画 实际上,Core Animation在macOS和iOS上是相同的。 但是,大多数iOS用户会使用UIView进行动画处理 核心动画利用keyPath定义要进行动画处理的内容 CATransaction可用于显式设置多个属性的动画 动画完成后,动画属性仍将保持原始值,因此视觉效果将在动画结束时跳回 在动画代码之后将动画属性设置为最终值 在设置锚点和其他转换之前,将子视图添加到视图层次结构 CATransform本身是一个值,而不是动画。 进行设置,图层将转换为该特定值。 我已经完成了一个示例项目,以通过沿x轴进行3D变换来展示上述知识。 harryworld / RenderedImageView RenderedImageView –学习CALayer github.com
要制作360˚产品查看器,您需要从不同角度拍摄一系列产品照片。 我不会完成这些镜头的创建过程,但是,如果您想了解它,可以访问https://www.ecwid.com/blog/guide-to-360-product-photography.html 导入图像 拍摄完这些照片后,将那些照片拖到图像资产中。 不要忘了以递增的数字顺序命名它们。 设置视图 现在我们有了图片,现在让我们切换到情节提要,然后从ViewController中的Object Library中拖动ImageView。 向您的ImageView添加必要的约束。 我希望ImageView是整个宽度的正方形,并位于屏幕中央。 因此,我将在视图中添加“前导”,“尾随”和“垂直居中”约束,并在“ ImageView”中添加“ 1:1纵横比”约束。 您可以按照设计要求设置约束。 还将Pan Gesture Recognizer从对象库拖到ImageView。 要使Pan Gesture正常工作,必须为ImageView启用User Interaction。 要启用它,请转到“属性检查器”,然后在“交互”属性中检查“启用用户交互”属性。 编码!! 现在我们已经为360产品查看器设置了视图,让我们通过创建ImageView的Outlet和Pan Gesture Recognizer的动作开始编码。 @IBOutlet弱var imageView:UIImageView! @IBAction功能手势(_发送者:UIPanGestureRecognizer){ } 定义一些变量。 currentIndex将保存图像的当前索引, images将保存产品图像数组 将会显示的内容, lastPoint将保存最后一个触摸点的坐标,而灵敏度则定义了查看器的拖动灵敏度。 var currentIndex:Int = 0 var images:[UIImage] = [UIImage]() var lastPoint:CGPoint = CGPoint.zero 让敏感性:CGFloat = 5.0 现在,让我们在手势动作中编写一个逻辑,该逻辑将在拖动时更改imageView图像。 逻辑很简单。 当用户在imageView上拖动时,我们获得imageView上触摸点的坐标并将其设置为currentPoint 。 然后,我们检查拖动是刚刚开始还是已经开始。 如果拖动刚刚开始,则仅将lastPoint设置为currentPoint […]
Cocoapods是用于快速和对象C开发环境的强大而便捷的第三方库管理工具,在本主题中,如果您想了解有关cocoapods的更多信息,可以访问以下网站: https : //cocoapods.org 。 在本主题中,我将教您如何逐步安装Cocoapods,如果您有任何问题,可以给我发消息,我们可以一起讨论。 我的地址: imbearfly@gmail.com 步骤1:启动终端并安装ruby 2.2.2 逐行插入以下命令 curl -L https://get.rvm.io | bash -s稳定 源〜/ .rvm / scripts / rvm rvm -v rvm安装2.2.2 安装命令2.2.2之后,您将看到以下信息,系统要求您输入用户密码,插入操作系统密码,然后继续 ‘mkdir -p / etc / openssl’所需的密码: 步骤2:安装cocoapods并找到所需的软件包 cocoapods安装命令: 须藤宝石安装cocoapods 成功安装cocoapods之后,转到gococoapods网站以获取想要的程序包的“名称”( 您只需要包的名称 )>>> https://cocoapods.org 。 步骤3:将广告连播插入您的专案 在此步骤中,我将使用“ SDWWebImage”作为示例,首先找到您的项目的路径,然后将终端命令重定向到项目文件的文件夹,例如我的路径:“ Documents / PeterPanClass / class13thPrac” cd文件/ cd PeterPanClass / cd class13thPrac […]
介绍 作为iOS开发人员,我习惯于使用layoutSubviews手动编写UI布局。 但是,我花了很多时间在代码中调整自定义表格视图单元的大小,并且不得不手动计算每个标签,图像视图,文本字段以及单元中其他所有元素的高度。 因此,我想找到一个更优雅,更简洁的解决方案。 进行调查后,我将注意力转向了两个老朋友-自动版式和情节提要。 实作 在本文中,我将构建一个非常简单的消息传递应用程序,它的功能仅仅是响应用户发送的内容。 请注意,我将跳过一些无关紧要的步骤,例如,创建视图控制器或自定义表格视图单元格类。 让我们开始使用我们的UI组件。 将表视图,文本字段和发送按钮拖放到情节提要中,然后将它们与视图控制器挂钩。 final class MessagingViewController: UIViewController { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var textField: UITextField! @IBOutlet weak var sendButton: UIButton! // … } 此外,使用情节提要的“ Pin menu设置以下约束: 将表视图的顶部边缘固定在其父视图的顶部边缘0个点处。 将表视图的前缘和后缘固定到其父视图的前缘和后缘0个点。 将文本框底部的边缘固定在距文本字段顶部8个点的位置。 将文本字段的前沿固定在其父视图的前沿距8个点的位置。 将文本字段的尾端固定在距离发送按钮的开头8个点的位置。 将文本字段的底部边缘固定在其超级视图的底部边缘8个点处。 对齐文本字段的顶部和底部边缘以及发送按钮。 完成约束后,移至文本字段的大小检查器,并将“ Horizontal Content Hugging Priority设置为249。设置此优先级应有助于扩展文本字段并修复警告。 其次,将图像视图和标签拖放到表格视图单元格中,并将其与自定义表格视图单元格挂钩。 final class MessagingCell: UITableViewCell { @IBOutlet […]