Tag: 迅捷

完美:服务器端Swift-响应说明

当请求完成其过程并且业务逻辑已完成与数据的处理/交互时,要求调用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字符串。 良好做法提示 在创建或重构任何代码段时,始终建议您在着手编写代码之前列出您需要完成的所有任务-您可以在该函数内使用带注释的行,并且可以在每个注释下键入该任务的代码 […]

使用Swift控制Raspberry Pi GPIO引脚并打开LED

在这里,我们安装了带有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中的函数

什么是功能? 函数是完成特定任务的自包含代码模块。 函数是一种过程或例程。 Swift中的每个函数都有一个类型,由该函数的参数类型和返回类型组成。 什么? 它基本上是一个模块,它接受输入(参数),对其进行处理并给出输出。 我们为什么需要它们? 我的意思是,您也可以不做这些事情,但是。 使您的代码看起来漂亮和简单可能非常有用。 哇! 您得到了输出,但仅设想使用100个不同的值即可完成输出。 您的代码看起来很讨厌。 相反,您可以执行此操作。 哇! 种类 1.不带参数的功能 不需要参数。 2.具有多个参数的功能 函数可以具有多个参数。 这取决于您的要求。 3.没有返回值的函数 同样,如果函数不返回值也可以。 在某些情况下,您仅需要输入而又不希望函数返回任何内容。 4.具有多个返回值的函数 您可以使用元组类型作为函数的返回类型以返回多个。 5.可选的元组返回类型 元组可能没有价值,这也可能发生。 因此,在这种情况下,您应该返回一个可选的元组。 6.功能参数标签和参数名称 函数参数同时具有参数标签和参数名称 。 参数标签在调用函数时使用,并且可以在其前面带有标签。 您可以指定参数标签。 7.省略参数标签 您也可以省略标签。 有时很明显,在调用函数时不需要标签。 8.默认参数值 这是一个非常有用的功能。 您可以为参数设置默认值。 现在,即使您不传递值,该函数也会使用默认值。 9.可变参数 可变参数用于指定该参数可以具有多个值。 10.进出参数 试想一下,您希望变量被函数更改。 你刚刚说什么? 让我给你举个例子。 让我告诉你这里发生了什么。 现在,存在一个可变的总和,并且每次添加时都需要对其进行更新。 现在,有一种更好的方法可以做到这一点。 当您将变量(&)作为参数传入和传出参数时,应将“&”号直接放在变量名之前。 这是规则。 11.函数类型 每个函数都有一个特定的函数类型 ,由函数的参数类型和返回类型组成。 该函数是()-> […]

我的第一个Cocoapod在这里🎉—果冻1.0

是的,我的第一个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做| […]

在Swift 3.0中创建矩阵类

(在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 } } 将其数据保存在一维数组中意味着我们需要手动计算索引,但这是一个很小的代价,因为我们只需要执行一次即可。 之后,我们可以按以下方式访问数据: […]

比特币上的Swift-Lint危险

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做 […]

NSView和CALayer

我最近在构建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

使用Swift 3 in在iOS中制作自己的360˚Product Viewer

要制作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 —安装教程

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 […]