Tag: swift

这是什么逃逸封闭?

Xcode总是照顾这个问题 希望大家都知道闭包。 如果没有,请检查这篇文章 在将闭包作为参数传递时,我们需要确保闭包是否转义。 什么是转义? 如果在该函数内的将来调用采用了闭包,则应将其标记为转义。 让我们举个例子。 闭包引用不用于以后的调用。 因此,我们无需在此处转义。 闭包捕获在函数内部的异步块中。 因此将其标记为Escaping 。 如果未将其标记为转义,它将作为编译时错误抛出。 通过转义的闭包时,必须在闭包内捕获Self 。 看下面的例子 这就是逃避闭包。 感谢您阅读本! 如果这对您真的有用,请鼓掌并分享此帖。

在Swift中更轻松地使用JSON和POP编码

让我们从符合Codable的简单类型开始。 在这种情况下,我们将使用微博帖子,因为这是我现在花费太多精力的原因。 struct Post:可编码{ 让标题:字符串? 让内容:字符串 } 目前,我们大多数人都在像这样对JSON进行编码和解码。 let aPost = Post(title:nil, 内容:“一些非常有趣的评论”)//编码为JSON数据 让coder = JSONEncoder() 让数据=尝试? coder.encode(aPost)//从JSON Datalet解码器解码= JSONDecoder() 让restorePost =尝试吗? coder.decode(Post.self,来自:数据!) 这很好并且相对容易,但是每次仍然是相当数量的样板。 首先,您需要一个编码器/解码器,并且必须处理Codable API方法正在抛出方法的事实。 在此示例中,我try? 可选的返回方法。 如果您需要的不仅仅是返回值的可选值,那就更麻烦了。 然后,您将推出do-catch块以捕获和解析错误,如果您从不受控制的Web API消费JSON数据,则应该完全这样做。 借助一点点的POP,面向AKA协议的编程,魔术可以做得更好。 在可选返回值仍然足够的情况下。 将值类型存储到NSUserDefaults或以其他方式存储到磁盘以进行检索就是这种情况。 我们可以肯定地知道我们要存储和检索的内容,因此我们实际上并不需要错误捕获模式。 我们从我们的类型可以遵循的协议开始。 该协议没有任何要求,因为它将使用扩展程序来为这些便利功能提供默认功能。 协议JSONCodable {} 我们只希望此默认功能可用于已经符合Codable类型。 我们可以通过将协议作为Codable的扩展来实现这Codable ,但是我希望这些事情更加明确。 我们不想意外地忘记在其他Codable类型上使用这些方法,我们不确定可选返回是否足以满足要求。 为了实现这两个目标,我们将使用我们自己的显式协议JSONCodable并将其扩展JSONCodable也限制为Codable 。 这是我们的协议扩展。 它包含一些静态变量和2种方法,使其成为简单的代码行即可获取我们类型的JSON Data版本或从JSON Data中还原其实例。 扩展名JSONCodable其中Self:Codable { //我们方便使用的编码器和解码器。 //这些是类型要使用的静态变量 //本身而不是实例。 静态var编码器:JSONEncoder […]

为什么Qt for C ++仍然是事实:F噪音

如今,当您谈论桌面开发时,人们看着您就像是某种Luddite。 尽管对移动技术进行了大肆宣传,但诚实的事实是,最高效,最复杂的工作仍在台式机上(或通过在台式机上运行的浏览器)进行。 我喜欢Java,Swift及其它们,但是在构建桌面应用程序时,串联Qt的C ++仍然是最好的。 以下是我在2017年仍然是Qt迷的一些原因: 简单 具有C ++的Qt 易于使用。 唯一可比较的其他开发环境是XCode。 在启动过程中有了无数的出色范例,很快就可以弄湿自己的脚。 我知道,成为编码员的吸引力在于解决“凡人”几乎无法理解的那种复杂性,但是我还是简化UI构建之类的基本任务的忠实拥护者,以使其成为一门艺术而不是代替它可以解决一个复杂的数学问题。 Qt来自Java Swing和PyGTK背景,对我来说,Qt是天堂。 快速。 非常快。 众所周知,C ++是一种非常快速的语言,我相信Qt已经利用了这种速度。 比较我过去开发的软件的开发和交互,Qt总是比较灵活(我没有做任何基准测试,所以我可能是错的)。 即使在今天,当我大部分时间都在XCode上度过时,我仍然不禁为Qt的速度和轻便程度惊叹。 当然,这可能是基于我作为编码员的内部偏见和限制。 以下是我很久以前进行的基于GUI的原始归类的摘要。 在给定大数据集的情况下,它的工作方式像一种魅力,并且比Java更加清晰。 您可以自己尝试。 // MergeSort.cpp //类MergeSort成员函数定义。 #include 使用std :: vector; #include“ merge_sort_budget.h” //类MergeSoft定义 / ** MergeSort类的构造函数。 @param btList bt列出预算选项卡列表。 * / MergeSortBudget :: MergeSortBudget(BudgetTabList btList) { 大小= btList.size(); //验证vectorSize //使用带有不同日期的随机BudgetTabItems填充向量 对于(int i = 0; […]

斯威夫特のコンパイルエラーの仕组み

そンパイルエラーが出たときに原因を(りたンパイラのソース分析的に)探りたいときがある。その水深1cmまでをまとめてみたい。 これを読む阳离子(水深0.1cm) 手元にSwiftのコードがあること。下の场所から入手できる。私は下载Zip bonタンロードした。 苹果/斯威夫特 swift – Swift编程语言 github.com エラーメッセージのありか(水深0.3cm) 普段,プログラミンミ中に目にするエラーメッセージの文章は / include / swift / AST の中にある 诊断***。def という,拡张子がdefのファイルにまとめて书かれている。このファイルは复数あって,***には化化された名前が入る。 以下のものがある。 DiagnosticsParse.def DiagnosticsSema.def DiagnosticsClangImporter.def 诊断SIL.def 诊断IRGen.def DiagnosticsFrontend.def DiagnosticsDriver.def DiagnosticsRefactoring.def DiagnosticsCommon.def DiagnosticsAll.def での中で,DiagnosticsParse.def变成一个を抜粋するとこんな感じである。これは闭じ波括弧が多いというエラーメッセージ。 错误(extra_rbrace,none, “顶级的外部’}’”,() 定义数が多いものは,Swift4.1の时点で DiagnosticsParse.defに500以上 S800以上 ある。 ***の记事ではこのDiagnostics ***。defを「メッセージ定义ファイル」または「.defファイル」ということにする。 メッセージ定义の形式(水深0.7cm) メッセージ定义ファイル内の个々の定义は基本的に 错误(ID,选项,文本,签名) の形で行う。 ID エラーを识别を文字列。エラー発生处理でエラーを指定するのに用いる。 选项 何か付加情报を入れるようだが何もないことが多い 文本 コンパイル时に确定する部分は%が付けられている。これはC言语のprintfやObj-CのNSLog方式に似ている。 签名 Textのメーメッセージの中でコンパイル时に确定する部分の型をタプル形式で与える。文字の中でこれらが入る部分にはあらかじめ%が付けられている。 さっきのメッセージをあらためて见ると 错误(extra_rbrace,none, “顶级的外部’}’”,() […]

UICollectionView快照滚动和分页

对于具有相同大小的单元格和一个部分的集合视图,这是一种捕捉逻辑(可以轻松添加更多部分的逻辑)。 scrollViewWillEndDragging具有inout targetContentOffset参数,这意味着我们可以读取和修改滚动的结束位置。 幸运的是,我们不需要考虑插图,行或项目的间隔( 由于包含了它们而浪费了很多时间,因此无法理解为什么正确的数学会产生错误的结果 ),但是我们需要考虑情况用户滚动到最后一页的位置-targetContentOffset将在范围之内,但当前contentOffset不在范围内,因此我们也需要检查一下: //获取单元格宽度 让cellWidth = collectionView( collectionView, 布局:collectionView.collectionViewLayout, sizeForItemAtIndexPath:NSIndexPath(forItem:0,inSection:0)).width let page:CGFloat //计算建议的“页面” 让proposedPage = targetContentOffset.memory.x / cellWidth // 3.25应该返回第3页:floor(3.95)== floor(3) // 3.3+应该返回第4页:floor(4.0+)!= floor(3) 如果floor(proposedPage + 0.7)== floor(proposedPage) && scrollView.contentOffset.x <= targetContentOffset.memory.x { 页面=楼层(建议页面) } 其他{ 页=楼板(建议页+ 1) } //替换滚动的结束位置 targetContentOffset.memory = CGPoint( x:cellWidth *页面, y:targetContentOffset.memory.y ) 如果需要“真正的”分页,如一次滚动一页,我们需要做一些改动: //我们需要保存起点 私人var startingScrollingOffset = […]

Swift中的扩展

我在以前的博客中使用过Extension for Label。 在那里,我在扩展中添加了所有代码,但是您为什么想在本章中知道为什么这样做,我将很清楚所有这些东西在您自己的项目中创建和使用非常容易。 什么是扩展? 扩展为现有的class , structure , enumeration , or protocol type添加了新功能。 这包括扩展您无法访问原始源代码的类型的能力(称为追溯建模)。 扩展类似于Objective-C中的类别。 (与Objective-C类别不同,Swift 扩展没有名称。) 资料来源–苹果文件。 创建您的第一个扩展 通过写出类或Controller类(如extension和类名)的侧面, 扩展很容易创建 扩展UserModel { //您的功能 } 您可以将其用于符合协议 如果您在项目中使用表格视图,则需要使用这些方法来确认协议,但是,如果项目中以及其他协议中有很多方法,那么这将很难管理,并且大多数情况下,我们在查找代码时会遇到问题在我们班里。 在这个类中,您可以看到,这是每个这样开始开发的开发人员在开始阶段的基本代码。 如果您开始从事实际项目,这是一个很小的类,那么将有更多的功能和对象变得更加难以快速查找或检查您的代码。 现在,您可以非常清楚地看到您的代码被分为具有适当功能标识的组,其中Extension非常清楚地在此处定义了代码。 额外提示–“ MARK ”这将在文档编制过程中出现。 您可以访问此 ( NSHipster )链接以更好地理解Swift语言中的代码文档。 带扩展的代码分离 您可以借助扩展来编写属于特定协议的单独协议方法。 当您将来再次在同一个类中进行工作或进行修改时,它非常易于理解的代码。 芒果类: UIViewController { 覆盖func viewDidLoad (){ 超。 viewDidLoad () } } // MARK :-TableView数据源方法 […]

迅捷— LLVM的孩子

LLVM进步与迅捷 Swift的主要动机肯定是背负并继续利用LLVM工具链的进步。 值得注意的是,还有其他重要原因来引入一种更易于访问的新语言。 新的开发人员如虎添翼。 Obj-C不是最容易掌握的第一语言。 Swift开发的大概目标: SIL 借助Swift,编译团队决定引入一种新的中间语言,以同时启用语言功能和改进的编译。 LLVM的灵活性使他们能够做到这一点,并将其放入现有的编译流程中 关于此的大量信息来源是2015年LLVM开发人员会议上的一次演讲-Swift的高级IR:案例研究…。 看一下这个。 令人着迷。 好处 如以上链接中所述,SIL在编译期间在源(Swift)语义和IR语义之间实现了更大的差距。 这有一些明显的好处: 语言演变 -SIL使Swift语言编写者可以使用该语言编写更多的语言 安全性 -SIL允许在未初始化var和无法访问的代码等方面出现编译器错误 泛型 -影响语言功能的编译策略的一个非常有趣的示例 SIL允许使用支持动态调度和单独编译的泛型模型。 这不是依赖于模板实例化(例如Obj-C和C ++),后者使用的运行时策略会降低执行速度。 用更简单的语言来说,动态调度和单独编译是一种在编译时使用内联具体类型函数定义的策略。 这使得泛型在运行时的影响基本上不存在。 请查看(本页)[https://swift.org/blog/whole-module-optimizations/],了解其操作方法。 仅供参考,这称为功能专门化 。 总结一下 作为一名使用Swift语言的工程师,了解它的设计与苹果在拥护该工具链期间对LLVM的改进有多么巨大的联系是极为重要的。 它不仅为到目前为止我们已经看到的语言功能提供了很好的背景信息,而且还为这种仍然很年轻的语言提供了可能的指示!

iOS简介

IOS代表iphone操作系统 。 它是苹果掌上电脑的专有移动操作系统。 它支持Objective-C和Swift编程语言。 它基于Macintosh OSX。iPhone,ipod和iPad都带有IOS。 历史 iPhone于2007年6月首次发布,2007年9月5日,Apple发布了iPod Touch,它具有iPhone的大多数非电话功能。 苹果在2010年6月将iPhone Os更名为iOS。 第一代iPad于2010年4月发布,iPad Mini于2012年11月发布。 最新的iOS 11于2017年9月22日向公众发布,现在可以在iPhone 5s和更高版本,iPad mini 2和更高版本,iPad Air和更高版本,所有iPad Pro型号以及第六代iPod上下载触摸。 要开发iOS应用程序,请执行以下步骤: 注册为开发人员。 设计精美的应用程序界面。 学习Objective-C或Swift语言。 开发出色的应用程序。 了解您可用的技术。 访问文档。 调试和测试您的应用。 运送您的应用程序。 IOS平台的功能 多任务 社交媒体 iCloud的 在应用程序内购买 游戏中心 通知中心 加速度计 陀螺仪 强大的API 全球定位系统 高端处理器 辅助功能 蓝牙 方向 相机整合 位置服务 地图 电子邮件,联系人,网页和消息等 感谢您的帮助。 请提出任何疑问,意见或建议,以供以后发表。 感谢您的阅读! 📚

关于开发人员macOS Mojave的5件事

苹果刚刚宣布了面向开发人员的即将发布的名为Mojave的macOS更新(版本10.14)。 最终发布日期可能是9月或10月,这已经在科技界引起了轰动。 这可能会影响已经存在macOS应用程序的5种方法: 64位计算机已经存在至少10年了。 但是,许多较旧的应用程序仍然仅支持32位。 这意味着macOS必须同时支持32位和64位应用程序。 苹果已经宣布, Mojave将成为支持32位的最终操作系统。 通过Mojave针对开发人员的这一更改, 您有一年的准备时间并为10.15(适用于Apple的第一个64位操作系统) 更新其构建 。 否则,您的旧版32位应用程序将在2019年秋季不再运行。 macOS Mojave现在要求您的应用在使用摄像头,麦克风或任何自动化设备 (例如AppleScript和Apple Events)时请求权限。 这意味着,如果您的应用程序使用这些功能中的任何功能,则需要更新代码以请求这些权限,并在未授予权限时进行处理。 深色模式是更改UI以便在深色主题上使用更亮的功能 。 开发人员喜欢它,并且只要考虑到这一点构建应用程序,它就看起来很漂亮。 若要发挥优势,开发人员可以查看 有关如何支持暗模式的 Apple文档 。 对于网站,请确保您的背景颜色设置正确,并及时更新您可以添加到样式中的可能查询,以使其在黑暗模式下保持良好外观。 使用Mojave,Safari用户将必须开始明确地授予某些网站跟踪它们的权限。 如果您运行的网站使用任何形式的跟踪或像素定位,请注意这些更改。 您可能需要调整跟踪网站用户交互的方式。 股票应用在Mojave上使用“小杏仁饼”的示例 UIKit是用于开发iPhone和iPad应用程序的用户界面的框架。 有传言说“ Marzipan”是将UIKit引入Mac的桥梁。 在针对iOS开发人员的macOS开发文章中,我们推测了“ Marzipan”的含义。 好吧,今年他们宣布将把它带给Mac开发人员……可能在明年。 他们还为我们在Mojave中提供了预览,其中包括Home,Stocks,News和Calculator等应用。 虽然我们可以看到生成的应用程序,但仍然存在许多问题,例如: 这些应用的外观如何? 该框架使用起来有多容易? 同时构建Mac App和iOS App是否容易? 对于那些现在正在构建macOS Apps的人,这意味着有时间通过​​以下方式准备您的应用程序: 确保您正在组织代码以使用较新的API和方法 避免过时的代码和API 正确使用可在Apple平台上使用的其他框架和API,例如CoreData,Metal,CoreML等。 借助Mojave中面向开发人员的所有新功能,Apple首次为我们提供了路线图。 这意味着我们有时间到2019年第四季度: 更新macOS应用程序以仅使用64位 在用户界面中支持黑暗模式 支持增强的应用程序权限 (相机,麦克风等) 清理您的体系结构以正确使用跨平台框架和API。 […]

使用FunctionalTableData构建应用程序(第1部分)

Shopify构建的FunctionalTableData库采用另一种方法来解决先前的问题。 通过创建我们所有元素必须遵循的可重用的封装CellConfigType协议。 我们可以在UITableView和UICollectionView显示这些项目,而无需更改其中的任何一行代码。 使用CellConfigType 名为HostCell,的库提供了CellConfigType即用型实现HostCell,我们将在这些文章中使用它来降低学习难度。 当使用FunctionalTableData时, CellConfigType实例化实现是您唯一关心的问题,其余的工作将为您完成。 如果您感到好奇并想在内部进行窥视,欢迎您深入研究代码库。 HostCell由给定视图的UIView,状态和布局组成。 如果我们以应用预览(图1)为例, LabelCell的HostCell实现将类似于以下内容。 它可能看起来很多,但是一旦我们开始阅读代码,它就非常简单。 我们将State定义为表示视图的信息,在此示例中,UILabel可以具有文本,字体,以及是否为多行形式的State 。 图1的顶部单元很容易用此State表示。 我们可以利用LabelState初始化程序中的默认值,并创建一个LabelCell如下所示: