Tag: iOS应用开发

全面理解快速下标(第1部分)

介绍 : 当我第一次开始通过阅读Apple swift书来学习Swift时,我被这个怪异的单词Subscript吓倒了。 我曾经用第三括号从数组中检索数据。 但是我注意到有些结构有一个单词下标,而那些结构也使用第三个括号..so检索数据。今天,我将尝试解释什么是下标以及它如何神奇地工作。 问题: 如何在没有任何方法的情况下从结构,类和枚举访问列表 什么是下标? 下标只不过是创建用于访问集合,列表或序列的成员元素的快捷方式。换句话说,我们可以说下标是用于从struct,class和enum中访问元素的工具或No Name函数。 魔术下标语法: 在类或枚举下标语法中,就像没有方法名称的方法一样,它具有参数和返回类型,就像带有下标关键字的普通函数一样 基本下标示例: 让我们创建一个专辑结构,其中包含一个名为song的数组,其中包含所有六首歌曲并带有一个下标。 使用第三括号[]访问值: 现在,如果我们要访问歌曲数组,我们需要执行以下代码 在这里,我们创建一个专辑结构实例,并按下标访问歌曲列表的1个索引值。结果应为“ bikhon”。该专辑结构具有一个下标,该下标按其给定的索引号返回字符串值。 这是我们使用的第三个括号。第三个[]括号与数组访问[]不同 如果我们要以一般方式访问歌曲数组,则需要执行以下代码: 希望这是有意义的! 下标类别: 在Class中,其语法也与struct相同。Createclass及其属性,不使用关键字下标创建nome函数,并返回其值 从类中获取价值: 使用array和listOfPlanet数组创建Planet实例,并通过[indexNumber]访问planet列表 下标计算: 该Struct具有一个名为valueWithMultiply的存储属性,其下标带有一个Int值。 在下标主体中,此存储属性valueWithMultiply乘以Int值,然后返回Int。 使用乘数: 因此,创建并乘以值5并乘以5的乘数实例。 结果应为25。 为什么结果25: 1.Multiplier Struct有一个下标,该下标通过其参数( multipedBy )获取一个Int值。 2.在下标主体中,返回具有存储的属性(valueWithMultiply)和参数( multipedBy)的计算值 3.So这里,当我们创建值为5的实例“ fiveTimes”时 ,store属性(valueWithMultiply)得到5。 4.比当我们通过[5]访问该实例时,其下标参数取5并计算并返回25… 因此,在第2部分中,我将详细介绍字典Array中的下标Generic下标, 所以第二部分请点击这里:第二部分 继续摇摆。

在IOS中进行调试

大家好,我所有的IOS开发人员! 我们所有人都使用调试来发现错误以纠正它们,或者知道在我们编写的代码的底层发生了什么。 当我学习Objective-C时,对于IOS开发,我的一个朋友说,如果您成为一个优秀而高效的调试器,您将成为一个出色的程序员。 当我开始第一份工作后,很快我意识到了调试的重要性。 有时,我们需要在公司中调试其他人的代码,以了解他们的代码的逻辑和内幕。 从Apple Documents: 调试工作流程分为五个部分: 发现。 找出问题。 定位。 确定在代码中出现问题的位置。 检查。 检查正在运行的代码的控制流和数据结构以查找问题的原因。 固定。 将您的见解应用于问题原因以设计解决方案,并编辑适合的代码。 确认。 编辑后,运行该应用程序并使用调试器进行检查,以确保修复成功。 ->看下面的图片,熟悉调试工具,在Xcode上可以找到它们。 断点:我们使用它们来暂停应用程序,同时运行检查变量或了解我们编写的代码如何执行。 在断点调试中,我们主要使用“调试/运行”,“跳过”,“进入”和“退出”按钮,它们位于“调试”栏上。 >移入按钮有助于移入当前正在执行的方法。 >跳出按钮可以帮助跳过当前方法并移至源代码管理中的下一行。 -> Step-Over将执行当前代码行,如果该行中有任何func / method,它也会执行该代码并移至代码的下一行。 ->使用断点运行时,我们可以在Xcode的源代码文件上的任意位置单击鼠标右键,然后,如果选择“ continue to here ”,执行流程将在您单击的地方停止。 这样,您可以避免许多断点并更快地分析代码。 2.在Debug Navigator中,它形成一个调用堆栈,该堆栈将执行过程中的每个方法添加到断点命中为止,然后我们可以从正在执行的当前方法上进行任何级别的检查,以检查上一个步骤中发生了什么。代码行/方法。 它仍然显示与先前方法中使用的变量相同的值,这有助于通过发现问题进行调试。 3.如果我们要检查任何UIComponent的错误,可以使用Debug-hierarchy按钮,该按钮以3D视觉形式向您显示所有IBdesigned子视图,以检查视图的参数,视图层次结构等。 在调试中,我们通常通过-> 发现错误2.找到错误3.检查代码4.修复错误并5.确认过程。 Xcode中有许多类型的调试断点。 要查看列表,请通过单击左侧面板中的调试导航器来选择调试导航区域。 然后按一下底部左侧的+图标,以查看可用的断点类型。 异常断点: ->>在我们的开发中很多时候,我们都会在红色突出显示的行中看到“ Thread1:signal SIGABURT… ”之类的错误。 这可能会导致我们的代码出现异常。 例如,使用已存在的索引路径在表视图中插入新行。 对于这类异常,我们可以使用异常断点,该断点在发生异常的行中暂停执行。 一件很棒的事情是,通过与Xcode用户一起保存,我们可以在所有项目中使用这些异常的断点。 这样,在我们所有的项目中,只要发生异常,断点就会暂停执行。 您可以在Xcode中启用或禁用该断点。 我们要做的就是将异常断点移动到Xcode中的用户帐户。 >我们可以通过在断点导航区域中右键单击断点,然后选择共享来共享断点。 […]

如何将iOS 3D Touch作为UIGestureRecognizer应用于任何UIView

我知道,有传言称苹果将在2019年的新设备中删除3D Touch,但是我仍然爱上此功能,因为它是在iPhone 6s中首次实现的。 作为开发人员,我只在UITableView单元格,带有peek和pop的UICollectionView单元格以及iOS SpringBoard中的Quick Actions中实现了它,但是最近我需要有一个UIGestureRecognizer才能应用于可以拦截水龙头的任何拦截3D Touch的UIView ,拖动,ecc,但系统库中没有类似的功能。 作为对该实现的研究的结果,我编写了一个可以满足我的需求的UIGestureRecognizer子类。 第一步是在swift文件中导入正确的库,并创建空的UIGestureRecognizer子类,该子类将覆盖实现所需的四个方法:

iOS Trivia问题

有关应用程序,应用程序代理,窗口和RootViewController的21个简单问题。 FinishLaunchingWithOptions哪个类调用? UIApplicationMain 哪个类具有window属性? 应用程序委托 哪个类具有rootViewController属性? UIWindow 该应用的委托属性属于哪一类? UIApplication 哪个类实例化UIWindow? UIApplicationMain 哪个类实例化了rootView控制器? UIApplicationMain类 什么@标记可使应用程序知道该类是应用程序委托? @UIApplicationMain 您可以在项目中看到UIApplicationMain吗? 是,关于目标C,否是Swift 什么时候可以看到您的应用界面? 必须对窗口实例进行什么方法调用? MakeKeyandVisible 应用程序如何知道主故事板的名称? 在info.plist文件中。 如何在不使用主故事板的情况下创建应用? 在didFinishLaunchingWith选项中: 实例化一个UIWindow 将其分配给appdelegate.window 实例化视图控制器 分配给window.rootViewController 在窗口上调用makeKeyAndVisible 瞧 (请注意,这在如今并不常见) 视图实例化哪个类? UIView 哪个类可以让视图响应触摸和滑动? UIResponder 对或错,所有视图和图层都是UIResponders 假。 只有视图是UIResponders 是非题,一个应用程序始终只有一个UIWindow 假。 如果您的应用程序还使用一个外部屏幕,则它可以具有多个UIWindow 一种常见的情况是,如果用户已登录,则跳过登录屏幕。您将如何做? 检查UserDefaults的登录状态。 如果用户尚未登录,请继续执行该应用。 如果用户已登录,请在登录后实例化下一个视图控制器,并将其分配给window.rootviewcontroller。 是否可以继承UIWindow并使用它? 是的,只需将myWindow()分配给应用程序委托中的window属性。 如果您在不是根视图控制器的ViewController中,那么如何获得对窗口的引用? 在每个视图中。 引用“ self.view.window” 如果视图的window属性为nil,对用户有什么影响? 该窗口对用户不可见 您可以从应用程序委托实例获取对窗口的引用吗? 是的,您可以得到: […]

在iOS钥匙串中保存数据

您应该在哪里存储用户数据? 这是有关移动开发中用户数据安全性的最流行和最热门的主题之一。 不幸的是,它仍然没有一种好的实践。 有时,您的后端团队无法实施该解决方案以允许将凭据存储在散列中的设备中,或者您需要在该设备上保存多个帐户🤔。 在本文中,我将向您展示iOS系统中的钥匙串到底是什么,如何使用它来存储数据以及根据将敏感数据存储在设备上的一些最佳做法。 听起来不错👍? 走吧! iOS系统有一个有趣的东西,称为keychian🔐。 钥匙串只是用于存储所有敏感数据(如密码,证书等)的数据存储。 第二个问题-为什么安全? 因为钥匙串使用的是全面加密。 这意味着用密钥保护其中存储的数据。 密钥是基于唯一的设备数据和该设备的代码生成的(仅所有者知道)。 最小加密算法有128位AES。 自2016年以来,Apple启用了名为iCloud钥匙串的服务,这意味着用户可以在一个AppleID中的设备之间共享他的钥匙串。 嗯……看起来一切都在进行中,并且使用1.2版本的TLS加密进行同步,但是毕竟我意识到具有我所有凭据的文件都位于Apple服务器上的某个地方,这并没有让我感到高兴。 我不确定该解决方案,但我让您选择。 有关钥匙串本身的更多信息,请访问以下Apple支持频道:https://support.apple.com/zh-cn/HT202303 钥匙串是存储敏感数据的唯一相对安全的地方。 据推测,您将应用程序的配置数据保存在UserDefaults中。 但是您必须记住,这不是在此处存储敏感数据的安全场所,因为黑客很容易窃取它(足以访问设备)。 钥匙串并不是那么容易,只有用用户的密码才能破解。 好的,那么我们应该在钥匙串中存储哪些数据? 登录名和密码(哈希) 付款数据 加密算法的密钥 如果我再提醒自己一些东西,我会加it 将数据存储在钥匙串中还有另一个优势-如果用户决定从设备中删除该应用程序,然后又决定再次安装该应用程序,则该数据仍会保存(当然,如果用户不手动删除它,😅 )。 好了,是时候编写一些代码了! 访问钥匙串很容易实现。 Apple为我们完成的几乎全部工作➡️您只需从此处下载示例代码👉https://developer.apple.com/library/content/samplecode/GenericKeychain/Introduction/Intro.html,然后将其粘贴到您的项目结构中。 我总是在钥匙串配置中添加一个额外的结构: 好了,武器库可以使用🔫了。 首先,我们将关心将数据保存在钥匙串中。 注意:在本文中,我仅关注使用钥匙串,以便将数据保存为纯文本。 但是您必须记住有关以加密格式存储数据的信息。 函数setPasswordToKeychain()为我们的登录创建新的钥匙串对象,然后使用savePassword()方法保存密码。 此函数可能会引发错误,因此我正在使用docatch结构。 好的,它工作正常。 现在,我想从钥匙串下载用户名的密码。 我正在创建函数getPassword(): func getPassword(forUser用户:String)-> String? {} 情况很简单-方法以用户的登录名作为参数,然后以钥匙串形式返回密码,如果用户名未存储密码,则返回nil。 就是这样,它起作用了! 如前所述,我仅向您展示了一种从钥匙串保存和读取数据的方法。 请记住,您应该保护您的数据,即使用TouchID或一些额外的加密。 钥匙串还能做什么? 如果您有好奇心(作为开发人员,您应该是😁),我想您已经从Apple复制了支持文件。 如您所见,还有更多功能可以显示钥匙串可以提供的更多功能。 除了保存和读取密码外,钥匙串还允许您更改帐户名(用户登录名): 变异func […]

iOS活动-应用开发会议列表

这个故事最初发布在AppMakers.Dev 对于优秀的iOS App开发人员来说,每年举行一次最受欢迎的iOS活动和App开发会议的列表对您很有用。 会议可以帮助开发人员及时了解最新趋势,提高开发技能并建立新的联系。 对知识的投资将带来最大的利益。 (本杰明·富兰克林) Apps-Top.com团队和Alexander Adelmaer编写了iOS活动和应用开发会议的列表,这些列表对于iOS应用开发人员可能是很有趣的。 如果您喜欢此列表,请按照Medium上的apps-top进行操作。 请在App Conferences的官方网站上查看实际日期和价格。 欢迎您分享此帖子并将此列表添加到收藏夹。 点雨燕—欧洲雨燕会议 地点:法国巴黎 日期2018:2018年1月29日01:00 PM至06:30 PM(CET) 价格2018:1天139欧元 Forward Swift-旧金山的iOS活动,旨在庆祝Apple的新语言。 地点:美国,旧金山 日期2018:二月 DeveloperWeek —是世界上最大的开发人员博览会和会议系列,有8,000多名参与者 所在地:美国,奥克兰 日期:2018年2月5日至7日 游乐场-Swift和Apple开发者大会 所在地:澳大利亚 通常季节:2月 世界移动通信大会-移动行业聚会 所在地:西班牙巴塞罗那 日期:2018年2月26日至3月1日 MobileTech —慕尼黑移动技术大会 所在地:德国,慕尼黑 2018年日期:3月12日至14日 价格2018:449–1099欧元 Teki-con —技术会议 所在地:美国,亚特兰大 日期:2018年3月12日至14日 价格2018:699–849 $ Appdevcon —由应用程序开发人员召开的针对应用程序开发人员的会议。 所在地:荷兰,阿姆斯特丹 2018年日期:3月15日星期四08:00-3月16日星期五18:00 价格2018:145–410eur iOSCon 2018 —适用于iOS和Swift开发人员的iOS活动和会议 地点:英国,伦敦 日期:2018年3月22日至23日 RWDevCon —一个专注于高质量编程教程的会议。 […]

在Swift 4中使用JSONDecoder和Decodable的基于协议的通用网络

Swift 4已经发布了一段时间,本周(2017年12月)发布了XCode 9.2,对于Swift 4并没有太多戏剧性的更新,但是我们可以使用一些新工具来编写更简洁和可重用的代码,在本文中我们将主要关注JSONDecoder和Decodable协议,该协议有助于简化JSON的解析。 我们将创建可用于任何模型的通用API,因为我要在该项目上强调的是如何创建网络层,因此我们将仅解析JSON并将其作为模型打印在控制台中。 作为奖励,我将在该项目中添加第二部分,在该项目中,我们将使用协议扩展来使用XIBS创建UI。 对于此项目,我们将使用“电影数据库”中的API,您可以在此处查看其文档。 让我们从下载此入门项目开始,在该项目上您将找到一个名为Model的组和一个名为Networking的空组。 模型一包含两个模型,一个模型名为MovieFeedResult,具有电影类型数组的属性,另一个模型称为电影,我们将在完成网络层后重新访问这些文件。 我们将逐步创建网络层,创建一个新的Swift文件并将其命名为Result并将此枚举复制并粘贴到其中…… 枚举Result ,其中U:错误{ 成功案例(T) 案例失败(U) } 当我们发出URL请求时,我们可能会得到两种不同的响应,要么是成功的响应,要么是失败的响应。 通常,我们都会在完成处理程序设置中将两者都设为nil,但是通过此通用枚举,我们可以避免这种情况,并只传递每种情况所需的值。 接下来,我们将创建一个带有协议扩展名的协议,创建一个新文件并将其命名为Endpoint,复制并粘贴… 协议端点{ var base:字符串{get} var path:字符串{get} } 扩展端点{ var apiKey:字符串{ 返回“ api_key = 34a92f7d77a168fdcd9a46ee1863edf1” } var urlComponents:URLComponents { var components = URLComponents(string:base)! components.path =路径 components.query = apiKey 返回组件 } var request:URLRequest { 让url = urlComponents.url! 返回URLRequest(url:url) } } […]

Swift 4.2中可枚举的可本地化键

首先,在iOS应用程序中本地化内容似乎很容易。 NSLocalizedString 如果支持多种语言,API将在纯文本Localizable.string文件中查找给定键的转换值。 但是,这种机制很容易导致显影剂出错。 随着项目的发展,复杂性会增加:要支持的新语言环境,数百个新密钥,或者更改捆绑资源结构的不同且更复杂的构建过程可能会由于缺少翻译或更糟糕的副本而导致应用程序回归。 理想情况下,开发人员应仅使用在所有支持的语言环境中均已转换了其值的键,并且应确保在编译时发现本地化机制的最终损坏(丢失资源,格式错误,错误的键删除等),这是安全的。通过单元测试。 罪魁祸首是在NSLocalizedString键和Localizable.string文件中操纵原始字符串。 实际上,使用原始原始Strings缺乏编译时类型安全检查的优势。 解决此问题的一种方法是实现不透明类型,以表示可本地化的String,该String内部使用包含所有受支持键的String enum : 这将解决一半的问题,但是如何保证可本地化文件未损坏或在所有语言环境中都提供了有效的字符串呢? CaseIterable进行救援的枚举 Swift 4.2中引入的枚举中的CaseIterable协议一致性使得枚举可以枚举枚举中所有已定义的var allKeys: [EnumType] = [.case2, .case2, …]而无需手动实现所有键的数组(不再有var allKeys: [EnumType] = [.case2, .case2, …] !🎊)。 通过使LocaleKey与CaseIterable ,可以编写一个简单但有效的单元测试,该单元测试将遍历每种情况,以检查LocalizedText是否提供了转换后的值而不是返回键本身: 这将标记缺少的翻译,并防止意外错误在开发分支中合并。 多个地区 可以扩展LocalizedText结构以支持特定tableNames的注入,以便检查是否为每个语言环境提供了翻译: 然后, LocaleKeyTests单元测试可以检查所有支持的语言环境是否配置正确: Localizable.string中丢失的键/值将立即被捕获 GitHub上的示例项目中包含一个使用LanguageTableProvider的更广泛的示例:https://github.com/matsoftware/LocaleEnumerable 结论 CaseIterable枚举协议一致性的实现是真正的类型安全语言的发展中的重要一步。 String的本地化只是最简单的方案之一,其应用程序将通过连续集成中的简单单元测试来帮助减少人为错误的影响,从而减少时间和挫败感。 请在LinkedIn上关注我:https://www.linkedin.com/in/matcamp/

#33 Swift故事周

对于我们所有人来说,这是又一个了不起的一周。 我们达到了新的里程碑,新作家也加入了团队。 在我们短暂的生存期间,我可以说人们只是喜欢阅读Swift的故事。 原因如下: 在短短2周内,Swift2Go已达到500多名关注者。 每天阅读出版物故事超过2000分钟(33.3小时)。 有20位作家在Swift2Go下发表故事。 和往常一样,我想介绍一下本周加入Swift2Go的新作家以及他们发表的一些Swift故事: SwiftBits:缓存图像 在Swift中编写自定义模式匹配 我如何停止内存泄漏并回收150MB的内存— Swift 带有RxSwift的MVVM:用户登录 使用构建器模式进行下一级Swift单元测试 可解码的JSON解析—迅速的爱情故事 请为这些出色的作家提供一本书,以感谢他们对Swift2Go出版物的贡献。 任何愿意在Medium上编写Swift故事的人都应邀以作家的身份加入Swift2Go出版物,并为社区做出贡献。 您可以通过发送电子邮件至 info@swift2go.com 进行 申请 。 如果您想帮助发展这个社区,可以通过与您的朋友分享出版物或其中的故事来做到这一点。 🚀 关注我们并继续关注更多Swift故事。 👇

Swift提供了一组内置数据类型,这些数据类型是字符串,整数,浮点数…

Swift提供了一组内置数据类型,这些数据类型是字符串,整数,浮点数和布尔值。 在大多数编程语言中也可以找到这些数据类型。 在本文中,我们将详细讨论每种数据类型。 串 我们将介绍的第一个数据类型是字符串。 一系列字符代表一个字符串。 字符串用于在应用程序中显示文本。 用引号引起来的字符串称为字符串文字。 在编程中,我们不能只向Playgrounds添加文本。 因此,要编写字符串,我们必须将字符串用引号引起来。 让我们在Playgrounds中添加一个用引号引起来的名称: 在“操场”中,您的值将显示在“结果面板”中。 整数数据类型 整数 ( Ints )是整数(32和-100)。 当您需要执行计算(即加,减,乘等)时,整数很有用。 让我们向Playgrounds添加一些数字。 在下一行中,以您的名字键入32,然后在下一行中键入-100,如以下屏幕快照所示: 同样,您在名称下的结果面板中看到32和-100。 浮点数字 浮点数是具有小数部分的数字,例如4.993、0.5和-234.99。 让我们也将这些值添加到Playgrounds中: 布尔值 布尔值 ( bool )被称为逻辑值,因为它们可以是true或false。 当您需要确定某些逻辑是对还是错时,请使用布尔值。 例如,用户是否登录? 该声明将为true(是),或者为false(否)。 因此,在Playgrounds中,添加true和false: 现在,我们已经介绍了Swift中的所有主要数据类型。 目前,我们无法使用这些数据类型。 使用数据是变量和常量起作用的地方。 变量和常量—存放数据的位置 变量和常量就像包含任何数据的容器。 当要声明变量时,必须使用var关键字。 让我们声明我们之前做过的每种数据类型,但是这次使用变量和常量代替。 用字符串创建变量 首先,删除您已经在Playgrounds中输入的内容。 让我们声明第一个变量,名为fullName,并将其设置为您的名字: var fullName = “Craig Clayton” 前面的代码说我们有一个名为fullName的变量,并且它拥有Craig Clayton的字符串值。 您的结果面板会显示您的真实姓名作为其数据: 创建一个带有整数(int)的变量 现在,通过添加以下内容,创建一个名为age的int变量并将其设置为您的年龄(或您希望的年龄)。 年龄= 40 […]