Tag: swift

Swift的用户友好型错误消息

由Max Howell 无论您的代码多么出色,都会发生错误。 因此,良好的错误处理和消息传递对于完善的用户体验和使您的用户感到沮丧的应用程序至关重要。 NSError始终具有非常有用(且已翻译)的localizedDescription方法,该方法为您提供了有用的信息以呈现给用户。 如果错误严重困扰他们的需求,他们可以向您发送电子邮件,也可以将其发送给Google,或者自己弄清楚他们需要做什么。 那是因为可可错误。 苹果花时间使这些消息有用。 但是对于我们自己的错误,至少在Objective-C时代,很少有人愿意做Right Thing™: -(void)foo错误:(NSError **)错误{ 如果(badThing){*错误= [NSError errorWithDomain:@“ TODOland”代码:1 userInfo:nil]; 返回} // … } Swift坚持要通过try对您的应用进行更强大的编码,并具有真正出色的基于enum的自定义错误,因此我们可以轻松,准确地指定错误条件: 枚举AuthenticationError { 大小写无效密码 案例鼠标无法加入我们的服务 } 专家提示:您可以在函数本地编写错误枚举。 这通常是获得良好错误消息的最佳方法,而不必考虑错误对于全局范围的含义。 不幸的是,这些错误的localizedDescription通常为“操作无法完成”: 这违反了我们的介绍:向用户提供了信息丰富且有用的错误消息。 因此,Codebase对Error产生了以下extension : 因此, AuthenticationError.miceCannotJoinOurService的legibleDescription描述为: “AuthenticationError.miceCannotJoinOurService” 。 显然,一个好的localizedDescription会更好。 为此,使您的Error符合LocalizedError并实现errorDescription 。 但是让我们面对现实吧,现在没有时间这样做,上面的代码示例是一个很好的权宜之计。 上面的代码段经过了实战测试,并且经过了严格的测试,更加努力: 错误是来自Cocoa还是Swift枚举的NSError ? 弄清楚这一点是非常困难的:Swift在两个对象之间“有帮助地”架起了桥梁:( as? NSError和as? Error 总是正确的。我们还尝试了ObjC的isKindOfClass似乎可以工作一段时间,但是随后发现了Swift Error实例。 s变成了我们背后的NSError s,因此我们选择了上面的检查,这不是最安全的方法(长期使用的类名可能会更改),但是我们无法立即找到更好的方法,它也可以100%起作用。 如果存在根本错误,并且根本错误消息不是这样,则获取该潜在错误:“该操作无法完成。” CloudKit错误通常掩埋在潜在错误中,因此您(没有我们的代码段!)实际显示的错误是不友好。 将我们的legibleDescription代码与以下函数配对,无论屏幕上发生什么情况,该函数都会尝试显示警报控制器。 […]

等间距的UICollectionView单元格

大多数iOS开发人员使用UICollectionView,并且应内置等距单元 问题 苹果的iOS类UICollectionView和UICollectionViewFlowLayout被许多应用程序开发人员使用,并且大多数情况下这些类可以很好地协同工作,不需要太多的自定义,但是它们做得不好的一件事是自动为所有设备布局分配单元格。 在开发负责显示大型组织的REST服务的照片缩略图的应用程序时,我发现了这个问题。 使用默认值,甚至使用稍微调整的值,我的布局看起来都类似于以下屏幕截图。 虽然单元格之间的水平空白可能很好,但垂直空白要么不存在,要么与水平空白不一致; 同样,在屏幕边缘周围留有一些空白也很好。 可以调整这些值,但是对于每个设备和方向,每个值可以不同。 当前,Xcode的Interface Builder编辑器和UICollectionViewFlowLayout类都没有提供自动设置这些值的方法。 解决方案 为了解决这个问题,我写了一个UICollectionViewFlowLayout的子类DSSCollectionViewFlowLayout,它重写了prepareLayout方法以计算属性minimumLineSpacing,minimumInteritemSpacing和sectionInset所需的值,因此每当用户更改设备的方向或布局时,它们都具有相同的值。应用程序。 进行此更改后,每个单元格周围的空白区域将变得更加令人愉悦。 尽管每个单元周围的空白空间在设备和方向上都不同,但是在特定布局内,空白空间是一致的。 在为Apple平台开发软件时,与编写源代码相比,我更喜欢在故事板和XIB / NIB中尽可能多地添加设置,因此我决定将属性placeEqualSpaceAroundAllCells添加到我的子类中,以便可以在集合视图的内部打开或关闭此功能。资源“身份检查器”面板。 我的子类DSSCollectionViewFlowLayout的Objective-C标头声明了属性placeEqualSpaceAroundAllCells,因此我的prepareLayout版本将知道是否执行等距的空白计算。 子类的prepareLayout实现的Objective-C源代码显示了如何计算水平或垂直滚动​​的正确空间。 而且,为了好玩,我也写了一个Swift版本。 我目前仅将此代码用于正方形和矩形固定大小的单元格,但它也应与可变大小的单元格的集合视图一起使用。

将出色的日志带到您的iOS应用中📝

随着iOS SDK的每次迭代,应用程序变得越来越复杂。 几年前,标准应用程序只需要处理网络呼叫,也许还可以处理一些GPS或加速度计数据。 现在,它有望处理生物特征认证,增强现实,多种类型和大小的设备,并且清单还在继续。 在这种复杂的情况下,同样会出现复杂的问题,并且很难理解和调试。 因此,对于开发人员而言,提供尽可能多的日志记录信息变得至关重要,因为当出现问题时,这些日志将提供宝贵的帮助。 如果您仍在使用print()函数将消息记录到控制台,那么您会感到很惊讶:自iOS 10起,只有在将调试器附加到应用程序后,您的日志才可用。 如果您生成AdHoc或InHouse版本,并尝试使用Xcode的“设备”面板或macOS应用程序“控制台”查看日志,那么将找不到它们。 这是iOS 10引入了一组新的日志记录API的结果。 好消息是,这个新的API允许对日志进行更精确的控制,同时采用起来也相当简单。 首先,让我们看一下使用新API的等效print(“Hello World!”) : 很棒的是,在消息之前已添加了一个类别标签,这使得对特定消息进行过滤非常容易: 现在,假设您已经进行了一些AdHoc或InHouse构建以进行质量检查,并且您需要从中检索应用程序的日志,以便了解造成此问题的原因。 当您打开Console.app并开始与您的应用进行交互时,您会看到日志确实存在,但是它们却在非常密集的信息流中丢失了: 为了隔离它们,我们可以基于应用程序的名称来设置过滤器: 更进一步,可以为类别定义过滤器: 本文旨在对新的日志记录API进行介绍。 我已经介绍了最有可能为任何应用带来价值的功能,但是还有更多可用的功能,因此,我仅敦促您查看Apple提供的用于学习所有高级用例的资源: API的文档:https://developer.apple.com/documentation/os/logging 来自2016 WWDC的视频:https://developer.apple.com/videos/play/wwdc2016/721/ 演示项目:https://developer.apple.com/library/content/samplecode/Logging/Introduction/Intro.html 最初发布在 gist.github.com上 。

Swift的第七周-UI视图控制器–林信华–中

Swift的第7周-UI View Controller IB概述 建立从情节提要中的UI到控制器可以控制UI的控制器的连接。 通过添加从情节提要到类{}中的控制器的行。 (不起作用) 删除IB概述 必须同时在助理编辑器和大纲中删除。 Buttom(将buttom连接到助理编辑器) 1.将连接设置为有效 2.选择要在内部触摸的事件意味着一旦手指在该区域内触摸并离开屏幕,然后执行该功能 检查情节提要和助手编辑器之间的所有连接是否连接良好。 在开头隐藏分段的控件 通过输入answer.isHidden = false来显示以下segmentedControl: answer.istHidden = false 控制SegmentedControl(0表示左键,此处0表示“就是你” answer.selectedSegmentIndex = 0

反向链接列表

我目前正在解决iOS开发人员遇到的常见数据结构/算法问题,并且反向链接列表就是其中之一。 我们需要做的第一件事是建立链接列表的基础。 因此,我们要做的是编译将成为列表的节点列表,oneNode,twoNode和ThreeNode。 让我们编写一个函数以打印出链接列表,以仔细检查所有文件的顺序是否正确。 查看打印输出。 为了真正理解我们应该如何反向链接列表,让我们使用一些箭头来指示每个节点如何相互引用以及其最终外观如何。 目前,我们的链接列表如下所示: 1→2→3→无 我们想要的是……。 3→2→1→无 反转列表的方式应如下所示: 无←1→2→3→无 无←1←2→3→无 无←1←2←3 我们要完成的工作与反转数组有很大不同,在这种情况下,您可以简单地从最后一个元素开始迭代,然后从第一个元素结束。 这是实际上反转指针并确保正确调整头和尾以及其所有下一个值的问题。 让我们看一下这里发生的事情。 我们将currentNode设置为等于头,即链表中的第一个节点。 currentNode还是在while循环中用于定义条件语句的变量。 接下来,我们还有两个变量,previousNode和nextNode,它们也将进行更改。 只要currentNode不等于nil,我们就想遍历列表,如果它变为nil,我们想跳出循环。 1→2→3→n的可视化在这里很有用。 因此,我们要做的第一件事就是将nextNode设置为等于currentNode的下一个节点。 因此,我们从列表开始,以1为头节点,然后将nextNode设置为2,因此nextNode = currentNode?.next。 然后,我切换了齿轮以在return语句之前编写最后一行代码,即currentNode = nextNode,因为对我而言,从逻辑上讲,当我们完成对所有其他变量的引用的更改后,我们需要一个新的头节点迭代并重新计算所有其他值。 现在是棘手的部分……我们该如何处理previousNode和currentNode的next属性? 在我们的循环中,到目前为止,previousNode的值是以下nil,1、2。如果要递增,我们希望这些值变为1、2、3或previousNode等于CurrentNode。 但是,我们仍然需要容纳currentNode?.next,它在更改它之前指向了previousNode。 本质上,我们在翻转currentNode?.next和previousNode的值,如果我们注释掉这一行,则您会注意到节点列表未打印,它的位置是3。currentNode?.next = previousNode有助于跟踪之前的哪个节点在thirdNode之前。 然后,当我们考虑外循环的下一个迭代时,我们将previousNode设置为currentNode,因为它是列表中的下一个节点。 最后,将currentNode更改为nextNode,以继续到下一个节点值。 您返回上一个节点是因为我们要返回链接列表中的新“头”或初始节点。

Swift中的v / s类Struct

这个话题太优雅了 ,以至于使我感到困惑 。 它们可能有何不同,您可能会在想。 答案就在这里! 他们如何通过的? 类通过引用传递,结构通过值传递。 这是值得注意的主要区别。 让我们考虑下面的示例1: 如果您喜欢这篇文章,请与我们分享。 欢迎任何改进意见和将来的文章建议。

如何使CommonCrypto与您自己的Xcode 8 / Swift 3.0框架一起使用

准备包含模块映射文件,CommonCrypto.xcconfig和Info.plist的“ CommonCrypto”文件夹。 您可以从这里获取或创建自己的文件。 创建一个新的Xcode项目(跨平台)。 为您需要的每个平台添加目标。 在项目设置的“信息”选项卡下,将每个目标的配置都设置为CommonCrypto.xcconfig(用于“调试”和“发布”)。 在每个目标的“常规”选项卡下,您可能需要选中“仅允许应用程序扩展API”,以确保即使在应用程序扩展中也可以安全地使用框架。 删除项目中不需要的文件夹,例如“ CommonCrypto-iOS”,“ CommonCrypto-watchOS”,“ CommonCrypto-macOS”和“ CommonCrypto-tvOS”。 同时从项目目录下的文件系统中删除这些文件夹。 您需要的只是包含Info.plist,CommonCrypto.xcconfig和modulemap文件的“ CommonCrypto”文件夹。 对于每个目标,在“构建设置”下搜索“产品名称”,然后用“ CommonCrypto”(例如,代替“ CommonCrypto-watchOS”)替换在那里看到的内容。 对于每个目标,在“构建设置”下搜索“产品捆绑包标识符”,并将其替换为所有目标都具有相同的捆绑包ID。 就我而言,我将org.world.CommonCrypto-watchOS(等等)替换为org.world.CommonCrypto。 对于每个目标,在“构建设置”下搜索“ Info.plist文件”(对于watchOS目标,您将在其中找到“ CommonCrypto-watchOS / Info.plist”之类的东西),因此将其替换为“ CommonCrypto / Info.plist”。 现在,有两种可能的使用方式: a)将此CommonCrypto项目作为子项目添加到您的父swift框架中; b)为每个目标生成二进制文件,从而为每个平台生成CommonCrypto.framework,然后将其* .framework文件及其父文件夹复制到父项目中,方法是将它们拖放到Xcode并应用“如果需要复制项目”复选框(取消选择任何目标成员)虽然)。 如果将它们放在没有文件夹的位置,则Xcode将不允许这样做,因为它们的名称是等效的。 现在,只需在目标swift类中使用import CommonCrypto语句,即可使用基础CommonCrypto C API。 注意:Xcode中没有其他设置被调整,只有上面列出的设置。 截图供参考 链接 模块— Clang 4.0文档 大多数软件是使用许多软件库构建的,包括平台提供的库,内部… clang.llvm.org

Mi Prima应用程序。 Contador de asistencia。 –马里奥·马丁内斯–中

Mi Prima应用程序。 Contador de asistencia。 Swift在iOS上的Estoy haciendo una app。 拉奎斯塔·德·马萨斯(Quaero) 在iOS或Programme de Nasiva上进行演绎的应用程序。 Tanfácilcomo poderañadirgrupos de personas para dividir la asistencia。 El prototipoestáecho con tan solo 9líneasdecódigo。 您可以在Tengo,Decir和estoy的官方网站上浏览。 zh-cn:https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/index.html#//apple_ref/doc/uid/TP40015214-CH2-SW1 Todo可使用Xcode编写的Story Storyboard。 声明变数和变奏曲的年龄以及其他原因。 Con拖放。 Llegar hastaahísin ayuda es muy compulado,estamos tan acostumbrados defineir un nombre para el objeto y luego hacer referencia deélen elcódigoque llegar hasta […]

让我们快速了解分组通知-iOS 12

iOS 12具有分组通知! 使用threadIdentifier创建通知内容以创建该通知的组。 分组将属于该应用程序或来自某个应用程序的特定主题。 //使用线程标识符创建组 让内容= UNMutableNotificationContent() content.title =“通知组” content.body =“ Ashish Kakkad的教程” content.threadIdentifier =“ notify-team-ios” 通知有效载荷将如下所示 { “ aps”:{ “警告”:{ “ title”:“通知组”, “ body”:“ Ashish Kakkad的教程” } “ thread-id”:“ notify-team-ios” } } 为组的特定目的给线程标识符赋予有意义的名称。 简单通知组摘要 让summaryFormat =“%u更多消息” 返回UNNotificationCategory(标识符:“类别标识符”,操作:[],intentIdentifiers:[],hiddenPreviewsBodyPlaceholder:nil,categorySummaryFormat:summaryFormat,选项:[]) 隐藏的预览摘要自定义 让summaryFormat =“%u更多消息” let hiddenPreviewsPlaceholder =“%u条消息” 返回UNNotificationCategory(标识符:“类别标识符”,操作:[],intentIdentifiers:[],hiddenPreviewsBodyPlaceholder:hiddenPreviewsPlaceholder,categorySummaryFormat:summaryFormat,选项:[]) 带有参数的通知组摘要 让summaryFormat =“%u来自%@的更多消息” 返回UNNotificationCategory(标识符:“组消息”,操作:[],intentIdentifiers:[],hiddenPreviewsBodyPlaceholder:nil,categorySummaryFormat:summaryFormat,选项:[]) 通知组摘要参数 让内容= UNMutableNotificationContent() content.body =“…” content.threadIdentifier […]

iOSDC 2016情报まとめ

iOSDCが2016年8月20日(土)に开催されました🎉 2016年日本iOS开发者大会 iOSDC Japan 2016は2016年8月20日(土)に开催される,エンジニアが主役の,iOSと周辺技术を插入としたカンファレンスです 。iosdc.jp 3月に开催されて世界中から著名なSwiftエンジニアが集结した尝试! Swiftに匹敌する,400人规模の大きなiOS系カンファレンスです。 尝试! 雨燕初日に参加しました 2016年3月2日〜4日に渋谷マークシティで开催されている尝试! Swiftという,世界中から著名なSwiftエンジニアアが集が500人规模のカンファレンスの初日に参加しました。 仆もトークに応募したら通ったので,「Swiftのこれまでの动向のまとめと先前のさらなる発展の期待」と题してトラックBにて14时55分から15分の発表をしました😝 iOSDCで発表してきました「Swiftのこれまでの动向のまとめと逐渐のさらなる発展の期待」 iOSDCにて,発表しました 🎉medium.com 面の面白そうなトークが応募されて,20日の枠に收まりきらなかったものがありました。それらすべてをリジェクトするのはもったいないということで,今日19日の夕方からもトーク枠が设けられて前夜祭が行われました🎉 こちらでライブ中継され,あとから観ることも可能です👀 iOSDC #iosdc 修改说明 www.youtube.com iOSDC Japan 2016前夜祭| 新鲜! by AbemaTV(フレッシュバイアベマティーヴィー)–无料で生放送が见放题 2016年8月19日日に开催される,iOSDC日本2016前夜祭のライブ配信です。iOSDC(iOS开发者大会)日本2016は,iOSとその周辺技术に关するエンジニアニためのカのカン… abemafresh.tv iOSDC日本2016 | 新鲜! by AbemaTV(フレッシュバイアベマティーヴィー)–无料で生放送が见放题 2016年8月20日に开催される,iOSDC日本2016年のライブ配信です。iOSDC(iOS开发者大会)日本2016年は,iOSとその周辺技术に关するエンジニアアのためのカンファ… abemafresh.tv iOSDC公式アプリもリリースされました👏 DC,こちらがiOSDC公式Twitter ・ #iosdcハッシュタグリンクですヽ(・ω・`) iOSDC(@iosdcjp)| 推特 iOSDC的最新推文(@iosdcjp)。 2016/08/20に开催予定定のiOS开发者大会日本2016の公式アカウントです。ハッシュタグ:#iosdc… twitter.com Twitter上的#iosdc主题标签 在Twitter上查看有关#iosdc的推文。 看看别人在说什么,然后加入对话。 twitter.com get,togetterに全セッションがまとめられていて,素晴らしいです👏 「#iosdc」の検索结果 getとめの中から「#iosdc」の検索结果を表示しています 。togetter.com もたくさんあります,写真もたくさんあります(´・‿・`) […]