Tag: swift

对值类型使用领域

在本文中,我想探讨如何使用基于struct的模型和类型安全的查询在Realm之上构建数据持久层 。 如果您在过去的两年中一直被碳酸盐岩所冻结,那么Realm是一种从头开始为移动设备构建的数据库技术,它实际上是Apple世界中Core Data的替代品。 与Core Data一样,Realm需要子类化来定义模型对象,并且仅允许在创建它们的线程上使用它们。 这些要求和其他要求通常会增加复杂性,并且通常会在应用程序中的任何地方增加与Realm的耦合。 这就是为什么将这些框架视为实现细节并将它们抽象到持久层下通常是一个好主意的原因。 楷模 例如,让我们创建一个持久层,以将漫画书中的超级英雄角色与其发布者一起存储。 我们可以使用几个结构来定义我们的模型: 公共结构发布者{ 公共租用标识符:Int 公开名称:String } 公共结构字符{ 公共租用标识符:Int 公开名称:String public let realName:字符串 公开让发布者:发布者? } 尽管我们仅将它们仅用作传输机制并将它们对应用程序的其余部分隐藏,但我们仍然需要创建相应的RealmSwift.Object子类。 最后一个类 PublisherObject:对象{ 动态var标识符= 0 动态var名称=“” 覆盖静态函数 primaryKey()->字符串? { 返回 “标识符” } } 最终课程 CharacterObject:对象{ 动态var标识符= 0 动态var名称=“” 动态var realName =“” 动态var发布者:PublisherObject? 覆盖静态函数 primaryKey()->字符串? { 返回 “标识符” } } 制图 我们需要一种机制来将基于struct的模型转换为其相应的Realm对象。 让我们为此定义一个协议: […]

UITableView自定义大小的单元格(使用UITableViewAutomaticDimension自动计算行高)

一个简单,用途广泛但功能强大的视图,可以使用行和单个列以列表形式显示数据。 用户可以在表视图中垂直滚动项,并可以选择操作和选择内容。 自定格单元 苹果公司推出了自动上浆电池。 使用Autolayout显式地布局UITableViewCells,UITableView会为您处理其余的工作。 行高是自动计算的,默认情况下rowHeight值为UITableViewAutomaticDimension。 在计算自调整大小的单元格时,将使用UITableView属性estimatedRowHeight。 创建自定义大小的表格视图单元格时,需要设置此属性并使用约束来定义 单元的大小。 — Apple,UITableView文档 self.tableView.estimatedRowHeight = 44.0 请注意,如果要为所有单元格设置动态高度,则不需要 tableView的委托的heightForRowAtIndexPath。 只需在必要时以及重新加载或加载表格视图之前设置以上属性。 但是,您可以通过以下功能设置特定单元格的高度,同时使其他单元格动态化: 迅速 覆盖func tableView(tableView:UITableView,heightForRowAtIndexPath indexPath:NSIndexPath)-> CGFloat { 切换indexPath.section { 情况1: 返回60 默认: 返回UITableViewAutomaticDimension } } 目标C -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 开关(indexPath.section){ 情况1: 返回60; 默认: 返回UITableViewAutomaticDimension; } }

RectUtil – iOS CGRect实用程序

CGRect是一个功能强大的结构,用于设置屏幕上视图的位置,大小和框架。 RectUtil是CGRect的语法糖,可实现相同的功能。 它涵盖了CGRect的基本功能。 与CGRect互动时,它将使您的生活更轻松。 该实用程序具有以下功能: 更改框架的原点X和Y 易于更改框架的大小(宽度和高度) 框架收缩高度 寻找两点之间的距离 更改容器视图内视图的中心 下载示例项目 如何运行: 打开项目文件 选择GeometryPlayground.playground 选择显示助手编辑器。 热键: cmd + alt + enter 下面的代码将在操场上呈现您的视图: XCPlaygroundPage.currentPage.liveView = superView RectUtil方法: 当您想要更改帧的原点X或Y值时: button.frame = CGRectUtility.GMRectWithSetXOrigin(rect: button.frame, newXOrigin: 20.0) button.frame = CGRectUtility.GMRectWithSetYOrigin(rect: button.frame, newXOrigin: 20.0) 您也可以一起做: button.frame = CGRectUtility.GMRectWithSetXAndYOrigin(rect: button.frame, newXOrigin: 10.0, newYOrigin: 10.0) 在下面使用以更改框架的宽度或高度: button.frame = CGRectUtility.GMRectWithSetWidth(rect: button.frame, newWidth: 300.0) […]

使用Swift使用自定义徽标和颜色生成QR码

QR代码用于在Twitter和Snapchat等应用中共享内容或添加新用户。 从iOS 11开始,用户可以使用内置的相机应用程序扫描QR码。 这使得在您自己的应用程序中集成QR码变得更好。 在iOS中生成QR码 自从引入CIQRCodeGenerator核心图像过滤器以来,在iOS中生成QR代码比以往任何时候都容易。 它为给定的输入字符串生成纯黑白QR码。 guard let qrFilter = CIFilter(name: “CIQRCodeGenerator”) else { return nil } let qrData = absoluteString.data(using: String.Encoding.ascii) qrFilter.setValue(qrData, forKey: “inputMessage”) let qrTransform = CGAffineTransform(scaleX: 12, y: 12) let qrImage = qrFilter.outputImage?.transformed(by: qrTransform) 这个QR代码已经可以使用了,但它并不是很吸引人,并且可能与您自己的应用程序的出色设计不一致。 因此,如果我们可以对其进行自定义以适合我们的应用程序设计,那就太好了。 更改QR码的颜色 定制QR码的第一步是更改颜色。 我们分三个步骤进行操作: 反转黑白颜色 将黑色遮罩为透明 改变颜色 为了使此代码更易于使用,我们在CIImage上创建了一个扩展。 extension CIImage { /// Inverts the colors and […]

HTTP / 2 ・认证令牌的方式のSwift制プッシュ通知送信ライブラリを作りました

mono0926 / apns 通过在GitHub上创建一个帐户为apns开发做出贡献。 github.com 昨日プッシュ通知ライブラリリりたいと呟いてましたが,早くも作ってしまいました(・‿・`)脳内イメージ通りのがそのまま形になった感じで,けっこう自信作です(・‿・ `) baseいうFirebaseのようなサービスを使えば楽ではありますが,自分で处理を书く场合,HTTP / 2リクエスト时にセットする认证トークンの生成・検证处理がけっこう难しいです。また,その难しさゆえか比较的新しい(2015年12月から使えるようになった)という理由からか,この方式を使えるライブラリが少なめです。 くで语语语语语JS JS iOS iOS iOS iOS iOS iOS iOS iOS iOS iOS强い型で通知内容を组みたい,とも思います。 节点-apn /节点-apn node-apn –:调用:用于Node.js的Apple Push Notification模块 github.com Swift版では,VaporAPNSは良いなと思って使っていましたが,出したPRが却下されたり放置されてたりで,PR活动で自分の理想的な形に近づけるのは难しく感じ,一から作ってみました。 matthijs2704 / vapor-apns vapor-apns –用于蒸汽的简单APNS库(快速) github.com (あと,VaporAPNSは认证密钥ファイルを加工して,そのオリジナルファイルをしれっと上书きする处理が入っていたり(カットしても动いたので谜🤔)と,よく见たら気になる点がちょくちょく…。) 使い方 READMEがまだちゃんと书けておらず,テストコードをコピペして载せただけになっていますそれ,それ见るだけで大​​体の使い方が分かると思います。基本的に,通知に必要な要素をそのままStructに通知内容はコードで书くこともできますし,指定したjsonファイルを読んでセットするdともできます(Codable最高😎)。 にのライブラリリを元に,GUIアプリとと作作りたいなとも思っていますが,今はそこまで时间取れなさそうなので,先になりそうです。 CLIツールくらいは用意しようかなと思いましたが,色々な引数を文字列でセットするより,このライブララリのテストコード弄って所望のプッシュ通知打った方が手っ取り早いかなと思ったりしています🤔 というわけで,とりあえず今の段阶では,目的に応じてどちらかで活用してみてください。 APNSライブラリのテストコードをいじって実行 実行形式のSwiftPMプロジェクトを作って,APNS(https://github.com/mono0926/apns.git)への依存を追加してimport APNS (ただし现状ではmacOSでしか动かないので注意) 単体テストはほとんど书いていない件について dライブラリ系は大体単体テスト书いてましたが,今回は気付いたらほとんど书かずでした。Codable活用したせいか,书いてもコスパ悪い(念のため确认,程度になってしまう)かなと感じてまたとが多かったり,でした。また,実际にプッシュ通知シュ届くかをたまに确认すれば,あとはSwiftの型の强さで安心できる感じでした。 とはいえ,本当は书くべきかなというところをサboった感もあるので,今后リファクタリングついでに,多少テスト追加していこかなとも思っています(・‿・`) ちなみに今,プッシュ通知の本を书いていて(秋くらいに书き上げたい…),そのために细かいプッシュ通知を色々検证中なのですが,VaporAPNSでその细かいところが动いていないところがあって,PR出したりしていた势いでつい一から自作しちゃった感じです(・‿・`) iOSプッシュ通知プログラミンミ完全グイド iOS 11までのプッシュ通知シュログラグンミ完全网罗した本になる予定です。2017年9月公开目标で,新しいiOSリリースなどにも合わせて顺次アップデートしていく予定です。 leanpub.com また,もし今バグがあっても,そうやってこの本を书きながら使っていく中で皆溃せるかな,と目论んでいます(・‿・`)

深入核心图像–第一部分

我已经完成了本文的大部分示例项目。 您可以在这里查看: chriswebb09 / CoreCamera 通过在GitHub上创建一个帐户为CoreCamera开发做出贡献。 github.com 这篇文章标志着我将要在Core Image上写的一系列文章的开始。 那么为什么要使用Core Image? 低级处理图形可能会很混乱。 您走得越低,您对UIKit和Cocoa的追求就越远。 对于开发人员而言,幸运的是,Apple提供了用于与较低级图形进程进行交互的抽象/接口。 Core Image是这些抽象之一,它是在Apple生态系统中进行编码时经常会遇到的一个库。 从编辑静态图像到在实时视频内容上使用过滤器,Core Image的用途十分广泛,可以处理各种用例。 在我们开始之前,我只想警告您Core Image严重依赖KVO,这会使探索它有些困惑。 与您能够与之合作和操纵的世界相比,这个障碍显得苍白,所以我希望您坚持下去。 Core Image是一种图像处理和分析技术,旨在为静止图像和视频图像提供近乎实时的处理。 它使用GPU或CPU渲染路径处理来自Core Graphics,Core Video和Image I / O框架的图像数据类型。 -Apple文件 定义 CIImage:是用于在Core Image中处理图像数据的图像数据格式。 这是有关如何处理图像的食谱书/说明。 CIFilters将CIImage用作输入,然后将它们传递回去。 由于CIImages的执行是延迟执行的,因此只有在将它们放入可渲染格式后,配方/指令才会被遵循。 CIContext:是用于使用Quartz 2D,Metal或OpenGL进行Core Image处理的图形处理和分析的评估上下文。 CIContext是线程安全的不可变对象,但与它们一起使用的CIFilter不是。 CIDetector:是图像处理过程,用于注意和分类图像上的区别特征。 对于可能是眼睛,耳朵,鼻子等的脸,或者可能是形状,例如盒子。 核心图像内核:核心图像内核是在每个单个像素上运行的小型算法。 内核使用过滤器的参数并基于该参数执行其算法。 每个过滤器至少包裹一个内核。 内核是在目标图像上的每个单个像素上执行的功能。 内核包含我们运行以生成输出图像的处理算法。 执行量高是GPU按其设计方式进行设计的原因。 每次执行看起来可能并不多,但是与所有像素协同工作,同时进行渲染,很明显,我们需要专门的东西来处理它们。 扭曲内核:扭曲内核专为移动,变形,平移图像而设计。 如果您已经阅读了我在ARKit上撰写的较早的系列文章,我们将使用矩阵转换将节点放置在3D空间中。 扭曲内核对像素执行操作以完成这些操作。 颜色内核:颜色内核是负责仅使用颜色的颜色的内核。 它接收一个作为分量向量的参数。 这些成分是红色,绿色,蓝色和Alpha。 […]

如何防弹Swift代码库Pt。 1-自由使用模型

您的代码库中有几个模型? 5? 10点 30吗 你应该有几个? 简短的答案-应该比30更接近30。模型应该高度针对特定上下文,并且应该自由地创建新模型。 假设您正在构建与Instagram类似的应用。 例如,不要使用在整个代码库中使用的一个Account模型,而要创建上下文相关的Account模型,该模型为特定情况下的需求提供最小的负担。 在Instagram克隆应用中,主图片供稿应使用FeedAccount模型,配置文件标签应使用ProfileAccount模型,故事应使用StoryAccount模型,等等。 让我们看看当您决定在整个代码库中仅使用一种Account模型时会发生什么: 您通过应用程序进行思考并决定,最初,模型应该开始看起来像这样: Account模型包含5个简单易用的属性。 然后,您继续构建应用程序的主要图像供稿功能。 这些图像及其各自的元数据是从REST API端点中提取的。 您对自己说:“太好了! 我将添加Decodable协议一致性到Account模型,一切都会好起来!”然后,您查看从API请求返回的JSON的结构,看起来像这样 出于网络效率的考虑,您团队中的后端开发人员希望提供实现所需功能所需的最少数据量。 对于主图像提要,唯一需要的“ Account数据是帐户句柄,帐户ID和用于下载与该帐户关联的配置文件图像的URL。 您对自己说:“开枪! 在完成更改以处理Account模型的新用例之后,最终看起来像这样: 因为不是每个属性都可以通过JSON初始化,所以您必须将未从API请求显式返回的所有属性设为可选。 然后,您继续为应用程序构建主配置文件屏幕。 再次,您查看从后端团队返回的JSON,它看起来像这样: 再次,您修改Account模型以适合此新用例,并得到以下信息: 事情开始变得肮脏。 在仅两个用例之后,最初的Account模型从5个非可选属性开始,现在具有12个属性-其中9个是可选属性,而1个是大多数时间为空的数组。 这是在两个用例之后。 当您构建整个应用程序时会发生什么? 每当出现Account模型的新用例时,您都必须修改现有模型以适合该用例。 这是很难维护的,并且会导致编译器错误和错误。 此外,当有几个人在使用不同的功能,而所有这些都需要使用Account模型时,会发生什么情况? 每个人都可以更改帐户模型以适应其特定需求吗? 最终,开发人员将在不知不觉中彼此压倒,造成混乱和混乱。 您将最终获得一个带有50个属性的Account模型,其中大多数是可选的。 我曾经在这样的代码库中工作过,这完全是无法管理的,而且是绝对的痛苦。 让我们看一下如何通过创建多个特定于上下文的Account模型轻松解决此问题。 主图像供稿的Account模型仅需要3个属性。 因此,制作一个仅具有以下三个属性的FeedAccount模型: 繁荣。 简单。 重复ProfileAccount : 再次,简单。 这种方法使您可以立即在模型中添加和删除属性,而不必担心它将如何影响代码库的其余部分,而不必添加大量可选属性。 此外,模型的特定命名允许团队中的其他开发人员立即识别应该使用该模型的上下文。 您在维护代码库的模型层时遇到问题吗? 向我们发送电子邮件至hello@designpatterninsights.com。 我们帮助像您这样的雄心勃勃的公司构建和维护强大的Swift代码库,以满足业务目标。

SwiftLint入门教程

与团队的开发人员在项目中保持代码库的一致性和可维护性有时可能会非常困难,不同的约定和样​​式,以及跨开发人员使用该语言的不同层次的经验,可能会导致应用程序在大多数情况下很难调试和对于加入团队的新开发人员而言,大多数情况很难理解。 在研究一个项目的CI时,该项目将对我的团队有帮助,并且我避免了bug并保持代码的清洁。我发现了Swiftlint,这是一种用于执行Swift样式和约定的工具,它很好地遵循了Swift准则,由Realm团队维护,开源,这意味着Swift社区会不断对其进行更新。 首先,我将逐步向您展示如何将Swiftlint集成到您的项目中,这样它将在每次构建它时运行,然后,如果您不想在计算机上下载Swiftlint,则如何使用Hound CI, 我将使用我的一个存储库向您展示,但是如果您有任何小型应用程序或小型项目可以使用它,则必须使用自己的存储库,步骤相同,因此应该可以使用。 如果您没有安装Brewlin,我将使用Brew来安装Swiftlint,您可以按照其网站上的步骤进行操作。 安装完成后,打开终端并运行 酿造安装swiftlint 安装完成后,导航到您的项目文件夹,您可以按照此处的说明将其添加到您的项目中,但让我向您展示它,复制它… 如果哪个swiftlint> / dev / null; 然后 swiftlint elseecho“警告:未安装SwiftLint,请从https://github.com/realm/SwiftLint下载” 科幻 我们将向您的Xcode项目添加一个新的“运行脚本阶段”,因此,如果您不知道如何添加脚本,则打开您的项目,选择目标并转到“构建阶段”,请检查此链接。 像这样粘贴代码段… 构建您的应用程序,您应该有很多错误和警告,主要是如果您的项目安装了Pod,所以不用担心,很酷的事情是,我们可以配置使用Swiftlint时要检查或不检查的规则,我建议继续到其仓库中的Swiftlint规则文件,并查看所有这些文件。 要配置它非常简单,您要做的就是在项目文件夹中创建一个名为…的新文档。 .swiftlint.yml 就我而言,我是这样使用终端做的…… 触摸.swiftlint.yml 打开文件… 打开.swiftlint.yml 添加您想要或不包含的内容,此处的“配置”部分提供了一个示例。 不知道您的警告是什么样子,但是在我的项目中我可以看到很多Trailing_whitespace警告,这意味着行之间不应有任何空格,警告看起来像这样:“ Trailing Whitespace Violation:行不应包含尾随空格。 (trailing_whitespace)” 我没有在代码中保留空白的乐趣,但是我确实喜欢在签名和函数主体之间保留一个空格,因此我将禁用该规则,即默认情况下启用该规则,我怎么知道? 很好,规则库中的规则文件包含您需要的所有信息,请将其复制并粘贴到新文件中以禁用该规则,并避免检查吊舱中的代码。 disabled_rules: #排除运行中的规则标识符 -Trailing_whitespace 排除: #掉毛期间要忽略的路径。 优先于“ included”。 -迦太基 -豆荚 保存并构建后,您将看到警告和错误的数量现在大大减少了。 Swiftlint的一个很棒的事情是它还可以通过在终端上运行来自动纠正某些违规行为… swiftlint自动更正 在使用自动更正功能之前,只需做一个注释,磁盘上的文件就会被更正的版本覆盖。 请注意,运行前请确保已备份这些文件,swiftlint会自动更正,否则重要数据可能会丢失。 好吧,现在,如果您希望可以运行自动更正,我做到了,并且在我的终端上,它说“完成36个文件的修正!”,现在警告的数量从250降为46,对我来说更容易一个并决定我要保留什么样的规则并重构我需要的规则; 将来,我的代码将遵循这些规则。 在第一部分中就差不多了,现在让我向您展示如何使用Hound CI自动执行代码审查。 无需本地下载Swiftlint 我将为此使用另一个项目,并且我邀请您也使用您的另一个项目。 […]

ReactiveKit和Bond第1部分

Dr. No(我不会告诉您有关ReactiveKit的信息) 上周,我讨论了MVVM体系结构以及如何实现它的基础知识。 如果您还记得,我曾解释说,在MVVM中工作的开发人员在体系结构内工作时通常会采用反应框架。 今天,我们将快速浏览以下框架之一的一些基础知识:ReactiveKit。 ReactiveKit实际上分为两部分。 主要部分ReactiveKit本身是框架的核心。 债券是第二部分。 Bond位于ReactiveKit的顶部,并为UIKit提供反应性的“绑定”。 Bond可以单独用作管理状态更改的一种方法,或者如果您使用ReactiveKit反应性地构建内核,它提供了一种链接该内核与更多面向对象的UIKit的方法。 为了了解Bond的工作原理,让我们从他们给出的例子开始。 假设我们要在标签中立即显示用户在搜索栏中键入的任何内容。 这是我们在香草Swift中的做法: 覆盖func viewDidLoad(){ super.viewDidLoad() textField.addTarget(self,action:#selector(textChanged),for:.editingChanged) } func textChanged(){ label.text = textField.text } 非常简单。 但是,随着您开始添加UI元素并且视图控制器不断增长,将目标和功能全部放在代码的不同部分中可能会变得有些丑陋。 这是邦德中的样子: 覆盖func viewDidLoad(){ super.viewDidLoad() textField.reactive.text.observeNext {文本在 self.label.text =文字 } } 凉! 一切都集中在一个地方。 很清楚,这里到底发生了什么。 更好的是,Bond包含一些不错的Swifty糖,使它更易于阅读: textField.reactive.text.bind(发送至:label.reactive.text) 正如Bond文档所指出的那样,由于绑定到标签文本属性非常普遍,因此可以进一步缩短: textField.reactive.text.bind(收件人:标签) 而已。 一条线。 而且我们还没有失去任何可读性。 如果有的话,我们使查看我们的代码的人更容易知道发生了什么。 现在,这里是其中的功能部分。假设我们希望标签仅以大写字母显示: textField.reactive.text.map {$ 0?.uppercased()}。bind(to:label) 大多数UIKit对象都有Bond扩展。 找到它们的最简单方法是将.reactive添加到Xcode中的对象,然后查看列表中出现的内容。 因此,这里开始变得非常方便。 还记得上周我谈论MVVM的时候吗? […]

学习Swift和iOS开发第1部分:安装Xcode。

学习Swift和iOS开发第1部分:安装Xcode。 像任何优秀的工匠一样,我们需要交易的工具。 对于iOS开发人员(或macOS,tvOS,watchOS),该工具是Xcode。 画布对艺术家来说就像Xcode对iOS开发者一样。 它充当了我们的工作空间,富有创意的出路,沮丧的源头等等。 这将是一篇非常简短的文章,因为使用Xcode进行启动和运行实际上非常容易! Xcode是一个了不起的应用程序。 它是一套完整的工具和应用程序套件,使开发人员能够通过应用程序创造未来。 正如您将看到的,安装和入门非常简单。 首先,打开macOS App Store,然后在右上角的搜索栏中键入Xcode ,然后按Enter进行搜索。 结果加载后,Xcode将是第一个结果。 接下来,单击GET(因为我已经安装了它,所以我说它处于打开状态),然后输入您的Apple ID信息以开始下载。 请记住,这是一个庞大的应用程序(4.5 GB),安装后将占用近12 GB。 要打开Xcode,您所需要做的就是进入Applications文件夹,然后单击Xco​​de。 就是这么简单。 Xcode打开后,将显示“欢迎使用Xcode”屏幕,其中提供了多个选项供您选择。 这将是本书所有项目的启动板。 您将打开Xcode并从此处创建项目。 了解Xcode界面后,您将看到它在应用程序开发过程中的功能和帮助。 这篇文章简短而且有充分的理由-Apple通过提供如此精简的体验使我们的工作变得如此轻松。 如今,开始开发iOS的障碍非常少,我们只需单击几下就可以开始。 这意味着我们有更多时间专注于制作出色的应用程序。 在下一篇文章中,我们将简要介绍一些Swift基础知识,以供您品尝。