Tag: 保留所有权利

Swift已经具有结果类型

也许。 在过去的几年中,我有幸使用多种语言编写和部署应用程序。 Scala,ruby,javascript,haskell,clojure等。每次我拿起一个工具时,特别是如果它对我来说是新的,我都会尝试学习它的精髓。 编程语言是任何人都可以用来构建事物的思想和概念的工具箱。 但是,我对同事和在线使用当前可用工具的不满之处感到非常不满。 Rob Napier谈论了快速不是功能语言的话题,您应该注意一下。 这是关于如何使用一种语言的方式,而不是人们希望的方式的一课。 但是,我真的很失望Rob提出swift应该添加一个Result枚举。 Swift已经具有此功能,但是我想很多人都不喜欢它。 Swift具有Optional类型,但通常不会直接看到它。 您通过语言构造与可选元素进行交互。 一个例子: 在上面的示例中找不到“可选”,“一些”和“无”的字样。 Optional基本上是一种“也许”类型,直接在其语言中获得支持真的很好。 无需编写一堆case .some和其他类似的语句,我们只需使用let和其他语言结构来检测其中是否有任何东西。 下面的示例类似于针对Result类型看到的许多示例: 乍一看,这似乎很好。 我在许多快速项目中都添加了这样的枚举。 但是,最近我注意到,我总是不得不执行大量的仪式来从枚举中提取值: 或者可以尝试仅提取并使用成功案例: 为了与语言中已经存在的工具作斗争,需要进行大量工作。 Swift已经可以将函数标记为返回两种类型之一,一种是成功,另一种是Error ,并且它是throws 。 现在,我们可以使用语言的内置功能来调用该函数: 我已经说过很多人说他们避免throws因为他们认为使用异常进行控制流是不好的。 我同意,大多数情况下例外对于控制流是不合理的。 throw不会引发异常。 从迅速的文档: Swift为运行时引发,捕获,传播和操作可恢复错误提供了一流的支持。 错误不是例外情况。 可恢复的错误是预期的,应该对此进行计划。 标记为throws的函数返回Error类型为失败的结果,并且编译器强制程序员处理成功和错误情况。 do和catch就像专门的switch和case关键字,用于函数何时返回成功或错误值并提供人们期望的模式匹配功能。 是的,有rethrows以在函数堆栈中传播错误。 我在scala中做了完全相同的事情,以便在诸如Web请求之类的过程中“顺流”处理Result的错误。 这是使用类型和模式匹配的控制流,我很高兴它已内置在语言中,而不必每次都自己构建。 “ try ”一词是解释我要完成的任务的完美方法: 尝试一下,如果无法解决,我将以其他方式处理。 尝试/捕获情况的开始不是我最喜欢的单词,但我想不到更好的方法了。 我不是敏捷专家,我每天都不会使用它,我想听听您对这个问题的看法。 还是应该迅速添加一个Result枚举,并让程序员在throws和Result之间进行选择? 还是某些片段库会一直枚举而其他枚举却全部枚举的碎片库? 谢谢阅读。

快速滑动手势

首先先搜寻滑动手势识别器,并拉入画面中 我们可以在Storyboard上设定滑的方向 随后拉入程式码里产生IB动作 接着在IBAction写入程式码 @IBAction func swipAction(_发送者:UISwipeGestureRecognizer){ 打印(“右”) } 然后执行专案,向右滑即可 那么要同时发现不同的方向呢? 首先在IBAction上写入决定的方向,使用sender.direction 此时执行专案后,仍然只有向右滑有印,然后再重复将滑动手势识别器拉入画面,然后设置方向属性,然后各别拉入上述的程序码里。 使用程式码写侦测手势 首先先写入决定方向要做的事 然后再使用UISwipeGestureRecognizer(目标:自我,操作:#selector())的方法设置 接着在viewDidLoad执行此方法

Swift — memoize()逐步

最近,我一直在阅读有关Swift 3未来的文章。 对在服务器上使用Swift以及在该方面完成的工作特别感兴趣。 迅捷轨迹🚀 Swift具有巨大的潜力,可以成为构建从VR到移动到服务器再到AI 的主流语言。 仍然缺少一些关键的构建块,但已经奠定了坚实的基础。 其中,可以说是最重要的功能支持 ,从第一天开始就随语言一起提供。 功能迅捷 语言结构很好地表达了功能支持,这使得一些疯狂的热门功能实现成为一个例子,其中一个示例就是在WWDC’14 Session 404 – Advanced Swift中引入的备忘录功能(讨论从00:38开始)。 在这篇文章中,我希望探讨memoize的性质并解释其工作原理,将其从WWDC’17的“高级”轨道移至“基本”轨道。 记住 乍一看, memoize’s实现看起来像Brainfuck启发的Hello World,但请放心-它是Swift。 纯功能性Swift😼 步骤2:递归记忆 为什么此版本的memoize是递归的要点是,将工作闭包作为参数传递给它自己 ,这使工作闭包可以对自身的memoize’d版本进行递归调用。 这有资格获得令人赞叹的史诗般的胜利🎆 14号线 使用尾随闭包语法,我传递了2参数工作闭包以进行memoize. memoize的结果(环绕式闭合)存储在名为factorial的参数中。 从工作闭包体内 对 factorial(x-1) 的调用 是指传递给闭包的参数,它与 let factorial 命名 完全无关 。 15号线 let factorial类型为(Int) -> Int 推断输入Int是因为发现Int Type符合以下要求: 1.符合Hashable协议。 2.支持== , *和—操作。 之所以推断Return Int是因为在返回之前没有执行任何类型转换。 1号线 memoize的递归支持版本还使用2个类型占位符: T, […]

以安全的方式存储您的开发登录名和密码

作为开发人员,我们喜欢自动化的东西。 一遍又一遍地重复同样的平凡任务,没有什么比这更令人讨厌了。 例如,当您需要在应用程序中键入用户名和密码时,您正在开发。 最近,我找到了一种存储凭证的好方法,同时又将凭证与Git存储库保持隔离(因此不会将其透露给团队的其他成员)。 这是一个快速教程: 转到“管理方案”,我们需要运行非共享方案,如果您已经在使用非共享方案,请跳过下一步 复制当前方案,并确保未选中 共享框 在团队成员之间共享方案时,它们会添加到资源库中。 由于凭据应该是机密的,我们不希望那样。 3.编辑方案并添加两个新的环境变量, 4.现在,您可以轻松地通过[[NSProcessInfo processInfo]环境]访问env变量,例如 -(void)autofillDeveloperCredentials { NSDictionary * env = [[NSProcessInfo processInfo]环境]; NSString * defaultUsername = [env valueForKey:@“用户名”]; NSString * defaultPassword = [env valueForKey:@“ password”]; 如果(defaultUsername && defaultPassword){ self.emailOrUsername = defaultUsername; self.password = defaultPassword; } } 另一种方法是使用断点来设置变量的值。 断点列表通常不共享,因此仅存在于本地计算机上。 使用po debugger命令,您不仅可以检查变量值,还可以执行几乎所有方法。 例如,在下面的屏幕中,我正在更改局部变量的值。 如果选中“ 在评估acitons后自动继续”框,则该应用程序不会在此断点处停止。 感谢@merowing指出此方法