Tag: swift

什么是.self,.Type和.Protocol? 了解Swift元类型

亚型。 那是我每天使用的事物列表中的另一个, 但是如果我的生活依赖它,就无法在采访中解释 。 元类型在Swift中非常有用,您肯定已经在多种场合使用过它。 不幸的是,它们在代码中看起来很奇怪,在试图理解它们的真实含义时可能会引起一些混乱。 我曾经知道这些奇怪的后缀会如何使您感到困惑,但是请放心,一旦您了解了它们之间的区别,它们实际上就非常简单了。 但是在进入这一点之前,让我们退后一步: (PS:如果您发现在Medium上难以阅读的代码,也可以在我的博客SwiftRocks上阅读!) 如果看一下Apple的文档,就会发现一个元类型被定义为type的类型 。 等等,不是String类型吗? 已经是类型的String的类型可能是什么? SuperString 从理论上讲,这听起来很奇怪,但这是因为我们习惯了Swift的语法,该语法专门向我们隐藏了其中的一些细节,以使该语言易于使用。 要理解元类型,请尝试停止将事物视为类型,而开始更多地将它们视为实例和类 (uses关键字,而不是object!)。 考虑以下代码段:如何定义SwiftRocks()和: SwiftRocks ? struct SwiftRocks { 静态让作者=“布鲁诺·罗查” func postArticle(名称:字符串){} } 让博客:SwiftRocks = SwiftRocks() 您可以说SwiftRocks()是一个对象,而SwiftRocks是它的类型,但是相反,请尝试将SwiftRocks()作为实例 ,以及: SwiftRocks本身作为实例类型的表示 。 毕竟,您可以从blog调用实例方法postArticle() ,但不能访问类属性author 。 现在,我们如何访问author ? 最常见的方法是通过SwiftRocks.author ,它将直接为您返回一个String ,但是我会请您暂时忘记该String 。 还有另一种方法吗? 我知道布鲁诺! 您可以调用 type(of: blog).author ! 对! 这也是正确的,因为type(of)将一个对象转换为可以访问所有类属性的对象。 但是您是否曾经尝试仅调用type(of: blog)看看会发生什么? let something […]

使用与RxCocoa绑定的可点击按钮在Playgrounds中测试RxSwift代码。

想象一下建立一个注册流程,您想在其中改善Rx代码的特定部分。 想象一下,对于要测试的每个小更改,您都必须构建并运行该应用程序,点击注册,输入您的凭据,等等…… 幸运的是,有一种更快的方法。 您可以将Playgrounds与RxSwift结合使用,甚至可以制作可点击的实时按钮,并将其与RxCocoa绑定,以便您对水龙头做出反应! 如果您按照以下步骤进行操作,则非常简单: 创建一个新的Xcode项目。 (适用于iOS的Single View App) 安装“ RxSwift”和“ RxCocoa”吊舱。 (不要忘了关闭项目,然后从.xcworkspace文件再次打开它) 现在转到层次结构根目录的“项目”导航器(如果选择了任何内容,则可以通过以下方式取消选择它:Command + Tap),然后单击左下角的加号按钮以添加文件…,然后滚动到底部并选择在操场下的空白。 生成的项目结构应类似于下图。 我将游乐场命名为RxCocoaPlayground,但是您可以选择任何喜欢的名称。 4.现在,将以下代码添加到您的游乐场:

您的iOS项目的代码质量? 您为什么不解决一些皮棉问题?

众所周知,编写代码和编写漂亮的代码是有区别的。 特别是对于那些热爱开源并为开源项目做出贡献的人们,因为他们正在与团队合作以实现他们的项目目标,所以他们必须编写精美的代码。 因此,今天,我将讨论一些有用的工具,这些工具通过修复代码的皮棉问题来提高您的快速代码质量。 我将使用来自领域的SwiftLint作为修复我的swift代码的lint问题的工具。 第一步,让我们看看如何在项目中设置SwiftLint。 步骤01 创建一个新的Xcode项目 步骤02 从终端导航到项目目录 步骤03 由于我将cocoapods用作依赖项管理工具,因此我将按照以下步骤为我的项目设置cocoapods。 pod init vim podfile 创建Podfile后,请按“ i”切换以在终端中插入心情。 首先,提及目标iOS版本(平台:ios,’version’)始终是一个好习惯,您可以在frameworks部分下添加。 吊舱“ SwiftLint” 否则,如果您有与项目相关的其他Pod,则可以始终将它们放在与项目和项目相关的测试的单独目标下,也可以维护项目和测试通用的共享Pod组。 然后像往常一样,按Escape键并输入:wq来写下您的更改。 之后,运行以下命令来安装SwiftLint相关的Pod。 pod install 为我们的Xcode项目设置SwiftLint几乎完成了。 下一步是向项目添加“ 新建运行脚本”阶段 。 为了那个原因, 从项目导航器面板(Xcode的左侧窗格)中选择您的项目。转到Build Phases,然后按+(加号)图标。 单击“新建运行脚本阶段”,然后粘贴以下运行脚本(由于我们已通过CocoaPods安装了SwiftLint,因此该脚本应如下所示)。 “ $ {PODS_ROOT} / SwiftLint / swiftlint” 到这里开始,构建完成后,您将看到错误和警告列表。 然后再次构建您的项目。 由于我们已经在我们的项目中设置了SwiftLint,因此我想解释一些常见问题以及解决方法。 问题01:尾随空白违反 SwiftLint发出此警告是因为它已识别出空格或该特定行中的多余空行。 要解决此问题,我们必须删除SwiftLint警告所指向的未使用的空行。 问题02:违反行长 在此问题中,SwiftLint向您发出警告,因为您已经超过了特定代码行的最大字符长度。 要解决此问题,您必须将代码重构为不超过最大字符长度。 问题03:强制尝试违反 在这个例子中,我试图用try块强行包装一段代码块。 由于这不是一个好习惯,因此SwiftLint会给我们一个错误,以避免发生这种情况。 为了解决这个问题,我用do包裹了整个块/逻辑,如下面的代码所示,捕获了块。 这是与Xcode一起使用的一些有用的工具/扩展,以及遵循的iOS最佳实践的集合。 https://github.com/theswiftdev/awesome-xcode-extensions […]

Okta身份验证第2部分

选择OAuth 2.0流程: 本部分可帮助您基于以下几点选择OAuth流程。 您需要的令牌类型。 您正在构建的客户端应用程序的类型。 您的应用程序需要ID令牌吗? 根据下表,您可以选择所需的OAuth流程。 您要建立什么样的客户? 下面的流程图可以快速帮助您确定要使用的OAuth流。 对于本机应用程序,Okta使用带有证明密钥的授权代码流进行代码交换(PKCE)。 带有PKCE流的授权码: 对于本机/移动应用程序,客户端机密无法存储在应用程序中,因为它很容易被公开。 因此,本机应用程序应使用代码交换证明密钥(PKCE),该密钥作为秘密使用,以确保授权代码流的安全。 验证码流程相似,不同之处在于它包含各种流程中的PKCE元素。 PKCE身份验证代码流要求您的应用程序生成一个称为“代码验证程序”的加密随机密钥。 从验证程序创建一个“代码质询”,并将其与授权码请求一起传递。 在访问令牌请求中发送了授权代码后,代码验证程序将作为请求的一部分发送。 授权服务器使用哈希算法重新计算代码挑战,并比较两个代码挑战和验证者匹配,以了解客户端发送的两个请求。 带有PKCE的授权代码流是标准代码流,在开头有一个额外的步骤,在结尾有一个额外的验证。 从总体上讲,该流程包含以下步骤: 您的应用程序将生成一个代码验证器,然后是一个代码质询。 您的应用程序将浏览器与生成的代码质询一起定向到Okta登录页面,然后用户进行身份验证。 Okta使用授权代码重定向回您的本机应用程序。 您的应用程序将此代码以及代码验证器发送到Okta。 Okta返回访问和ID令牌,以及可选的刷新令牌。 您的应用程序现在可以代表用户使用这些令牌来调用资源服务器(例如API)。 第3部分我将用示例解释OpenID Connect。 🙂 而已。 😃😃😃感谢您的阅读。 如果您想在社交媒体上关注我,这里有一些链接。 Linkedin , twitter , github 。 您可以 在这里 查看我的上一篇文章 。

带有可折叠部分的UITableView

今天,我想演示一种简单的方法来实现具有可折叠/展开部分的UITableView 。 在文章的最后,您将看到完整的Xcode项目的链接。 首先,我尝试使用UITableViewHeaderFooterView,但很快我意识到我会写很多代码,并创建和注册.xib文件,这一点都不好玩。 这就是为什么我决定使用技巧并用简单的UITableViewCell子类替换标头的原因。 在下面的示例中,我将使用Swift3。另外,我认为您熟悉表视图。

Swift有一个漏洞—一种类型驱动的开发

我喜欢Swift的类型系统。 首先,当我从大约两年前的Objective-C切换到时,我被它的前身所采用的动态方法所宠坏了,以至于我感到非常不舒服。 在写了几个小时的Swift之后,我很累。 我不得不遵循它的规则并投身于类型系统,但是直到我停止与它抗争并遵循它的建议才不久。 我们建立了联系。 如今,我觉得我们是好朋友。 自从我对Swift有了更多经验以来,我对静态类型语言的评价一直在稳定增长。 我无法想象在没有静态分析和编译时间检查的情况下编写任何代码。 即使使用Python编写脚本,编写一些Bash实用程序,我也害怕在没有任何证据证明其正确性的情况下运行该东西。 最近,我偶然发现了埃德温·布雷迪(Edwin Brady)的一本奇妙的书— Idris的类型驱动开发 。 Edwin是纯函数式语言Idris的创建者。 在本书的第一章中,他解释了本书的名称不是巧合,而且确实是在流行测试驱动开发方法。 在TDD中,我们首先编写测试。 测试使我们能够设计数据流,而无需过多地关注实现细节。 Edwin的想法也是如此,但与其编写测试,我们首先编写接受和返回类型的函数。 Idris具有强大的字体系统,并且对Type-DD的重视不足为奇。 其销售功能是依赖类型 。 埃德温(Edwin)提出了一些非常简单的示例,在这些示例中正确使用类型可以使我们实现功能,而类型系统则使我们紧绷,因此我们不会做任何蠢事。 为了满足类型系统而不完成我们的实现,他引入了一个漏洞。 Hole是一个占位符,可以是您需要的任何类型,并且其类型由类型系统推断。 其目的是让您起草一个函数并快速跳转到下一个上下文并仅推迟其实现。 在编写Swift的一段时间里,我一直在使用一种非常相似的模式,在该模式中,我将使用fatalError来使编译器静音。 func numberOfChildren(inRooms rooms:[Room])-> Int { 致命错误() } 上面的代码编译,编译器不会抱怨,因为fatalError调用abort()并且它知道程序的终止。 但是,如果我们可以满足编译器并继续运行该怎么办? 我认为这是一个很好的主意,并尝试模仿Idris的孔概念。 我创建了AHole 。 这是一个非常简单的孔实现。 只有一个公共协议AHoleType和一个公共函数_hole_() func _hole_ (文件:StaticString = #file, 行:UInt = #line)-> A { 打印(“ AHole:在文件\(file)的行\(line)上为类型\(A.self)使用孔”) 返回A.holed() } 在存储库中,有第二个文件,该文件具有一些符合AHoleType的 […]

iOS中面向协议的Segues

早在2015年,WWDC上就有一个很棒的会议,叫做Swift in Practice。 还有一个示例,说明了如何使用segues面向协议的方式。 因此,我决定将此示例更新为Swift的最新版本,并向您展示。 首先,您应该知道示例应用程序只是一个名为“ Master-Detail”的Xcode模板项目,并进行了一些重构以提高可读性。 完整的源代码可在GitHub上找到。 处理串流的标准方法 当您想使用segues时,通常要做的是重写prepare(for:sender:)方法: 因此,您最终得到了一个不错的segue语法: 结论 这种方法使您的代码更加优雅和类型安全。 另外,如果不处理新的情况,编译器在添加新的序列时也会给出错误。 希望您喜欢本教程。 别忘了拍拍😄。 并在Twitter和Instagram上关注我。

如何使用Cocoapods安装Alamofire

你好 最近,我使用Cocoapods安装了Alamofire,以构建天气预报应用程序。 Alamofire是用Swift编写的HTTP网络库。 使用Alamofire,您可以做很多事情,例如从Web服务器下载数据。 访问https://github.com/Alamofire/Alamofire了解有关Alamofire的更多信息。 本文仅出于我自己的注释目的,因此我不会忘记安装过程。 什么是Cocoapods? Cocoapods是iOS项目中非常流行的依赖项管理器,它允许您以逻辑方式管理所有库。 访问https://cocoapods.org/了解更多信息。 将Cocoapods安装到项目中 打开您的终端并在下面写一行代码,然后将要求您输入密码。 须藤宝石安装cocoapods 安装完成后,您需要通过终端进入您的项目目录(使用cd命令),并在下面编写一行代码。 注意 :如果此时打开X代码,安装将无法正常进行。 按⌘+ Q退出X代码。 荚初始化 然后转到您的项目目录,您将找到一个名为“ Podfile ”的文件。 使用文本编辑器编辑“ Podfile” 当使用文本编辑器打开“ Podfile”时,文件的内容如下所示。 #取消注释下一行以定义项目的全局平台 #platform:ios,’9.0′ 目标’yourProjectName’做 #如果您不使用Swift并且不想使用动态框架,请注释下一行 use_frameworks! #yourProjectName的广告连播 目标’yourProjectNameTests’做 继承! :search_paths #测试豆荚 结束 目标’yourProjectNameTests’做 继承! :search_paths #测试豆荚 结束 结束 现在,您必须在源代码下方添加几行粗体代码。 (访问https://github.com/Alamofire/Alamofire#features以获取最新代码) 使用文本编辑器打开“ Podfile”时,文件内容如下所示。 #取消注释下一行以定义项目的全局平台 #platform:ios,’9.0′ 平台:ios,“ 10.0” 来源’https://github.com/CocoaPods/Specs.git’ 目标’yourProjectName’做 #如果您不使用Swift并且不想使用动态框架,请注释下一行 use_frameworks! pod’Alamofire’,’〜> […]

阿拉伯语作为iOS应用程序的默认语言

有时您想制作一个仅使用阿拉伯语的应用程序。 或者,您可能需要支持某些语言,但是您希望阿拉伯语成为默认的应用程序语言。 在这里,我们看到它是如何完成的,因为要弄清楚它并不直观。 您可能会完全按照设计指南的建议,直接在Xcode的Interface Builder中布局视图。 例如,如果您的设计如下图所示,则可以决定将按钮放在开头,将文本字段放在结尾。 这种方法的问题在于,iOS将认为这是您希望应用在从左到右模式下的外观。 也就是说,默认情况下,导航栏stil中的后退按钮将位于左侧,与导航控制器的后向滑动手势并排。 因此,更好的选择是像将项目本地化一样实施它。 也就是说,将文本字段放在最前面,将按钮放在最下面。 但是您可能会问,什么会颠覆我们的看法以给我们我们所期望的结果? 打开项目的info.plist作为源代码(右键单击->作为源代码打开)。 寻找CFBundleDevelopmentRegion 。 您可能会发现它类似于$(DEVELOPMENT_LANGUAGE) 。 将其更改为ar 。 而已。 运行您的项目并享受您的翻转界面。 但是,我不喜欢这种方法。 因为这可能会使您的项目有些荒谬的项目配置。 我的意思是,如果您打开项目设置(而非目标设置),则会在“本地化”部分中找到以下配置: 它说英语是开发语言,但实际上并非如此。 尽管可以删除它并添加阿拉伯语,但您不会将它的“ – Development Language部分放在前面。 同样,Xcode会为您的故事板生成您可能不需要的阿拉伯语本地化文件。 我比较喜欢以下方法,尽管有点笨拙。 脚步: 导航到您的project.xcodeproj 。 右键单击并选择“显示包装内容”。 使用文本编辑器打开project.pbxproj 。 ⌘ + F并寻找单词region 。 您应该找到两个匹配项developmentRegion和knownRegions 。 如下图所示,将en的值更改为ar 。 而已。 您将阿拉伯语作为开发语言。 您的应用已本地化。 您支持多种语言。 但是,您希望应用程序的首次运行使用阿拉伯语,然后用户可以更改它。 该怎么办? 在开始之前,最好先了解iOS如何为我们的应用选择正确的语言。 在此官方问答中对此进行了解释,但我将在此进行总结。 iOS在用户的语言首选项列表中选择第一种语言(在“ Settings应用程序的Settings General […]

如何开始iOS开发

所以您终于做到了。 您决定研究iOS开发。 从热情上讲,您想创建自己的第一个价值数百万美元的应用程序,但是很快就会被大量的学习内容和学习资源所淹没。 在接下来的几行中,我将为您提供刚开始时希望了解的所有基础知识。 尽管我认为您是编程的完整入门者,但该文章对其他领域的开发人员也有帮助。 程式语言 首先,我建议开始为编程打下坚实的基础。 而不是直接进入它,而是从各个来源复制粘贴糟糕的代码,甚至根本不了解任何事情,只是要注意,开发出价值一百万美元的应用程序并不是一件容易的事。 有关如何解决问题的简单概念将为您提供更多帮助。 应用于iOS开发,这意味着要了解Swift。 这是苹果公司开发的一种开放源代码编程语言,用于取代其更老的语言Objective-C。 在2014年之前,Objective-C是编写iOS应用程序的唯一官方方法。 尽管Objective-C仍然是一件很重要的事情,尤其是在具有大量旧代码的大型应用程序中,但我认为几年后苹果将开始弃用对它的支持。 这意味着,即使有,您也只能阅读/理解用Objective-C编写的代码。 因此,从Swift开始是必经之路。 在本文的底部,我将添加一些有关如何开始使用编程语言的链接。 开发环境 Swift具有开源的优势,已经部分支持在Linux等其他平台上运行,将来还会有更多支持。 另一方面,iOS开发依赖于只能在macOS(Apple的操作系统)上运行的多种工具。 我认为这不会很快改变,因为几乎所有用于构建iOS应用程序的工具都是封闭的,并且因为苹果通过Mac的销售赚了很多钱。 基本上,您只有一个选择:购买Mac。 但是,如前所述,我建议无论如何都要开始学习Swift,您可以在任何现代计算机上使用Docker和Visual Studio Code之类的工具来进行学习,看看是否愿意花时间和金钱来进行投资。 工具类 说到工具,一旦您决定通过使用macOS来实现编写iOS应用的梦想,那么该考虑一下构建自己的应用所需要的时间了。 您将在大部分时间花费的东西称为Xcode。 Xcode是一个IDE,基本上是一个具有许多高级功能的代码编辑器。 一开始就不必太担心这些,因为您会尽快了解最重要的那些。 您将很高兴使用的另一个工具是终端。 不要害羞地玩它。 我知道没有图形界面的工作起初可能令人生畏,但与此同时,它开放的可能性是无限的。 我建议先进入一些基本命令来切换目录,复制文件等。我认为,最好尽快了解版本控制系统Git,因为它是每个软件的核心开发项目。 你呢? 您是否已经开始学习Swift或iOS开发? 您使用了什么方法,一开始就做了什么? 为了结束这篇简短的文章,这里有一些指向我提到的最重要内容的链接: 官方Swift书(也可在iBooks中获得) Swift和Xcode学习资源概述 学习Git