Tag: 可选

Swift编程第8部分开始-类型转换,安全解压缩可选项和访问控制

在上一篇文章中,我们讨论了初始化,反初始化,覆盖和引用计数。 开始进行Swift编程第7部分-初始化和反初始化,覆盖和… 在上一篇文章中,我们讨论了结构,类,属性和方法。 medium.com 在这一部分中,我们将介绍一些在您自己的代码中经常使用的非常出色的工具。 让我们开始吧。 我不仅随机选择了一条毛毛虫的照片,因为它看起来不错,好吧,也许是的。 它实际上使我想起了打字 。 并不是说变量会像蝴蝶一样进入外壳,而是因为只要有意义,就可以将变量转换为另一种类型。 用外行的术语来说,类型转换是将变量从一种类型转换为另一种类型的过程。 您几乎可以将任何内容转换为String类型,当您打印出该值时,它并不总是很有意义,但是有可能。 让我们看看您是如何做到的,然后我再回头解释什么不起作用。 好的,这是我不断告诉您的那些有趣的部分之一。 如果您喜欢玩运动或与朋友喝酒,它可能不如棒球那么有趣。 但是,在编程方面,我们希望我们的代码安全! 我的意思是,我们不想使用nil值。 我们要确保在需要手工创建的每个值的步骤中,没有一个值,或者我们适当地处理了它。 现在有点免责声明,关于编程语言,我可能不知道在编程世界中会有一场辩论。 老实说,这对我很有效,很容易理解,而且我相信人们有权决定哪种方法是正确的方法。 如果这导致评论中的讨论,那就这样吧。 我们有几种方法可以解开可选选项,其中第一种在Swift代码中更常见。 if let if var guard let 让我们从最常见到最不常见。 if let语句用于将值赋给常量,以便在if语句内部使用。 因此,让我们谈谈代码的可见性以及它与代码世界其他部分的关系。 每当您创建一个新项目时,您都在创建一个模块。 当您采用其他人的代码作为框架(可用于扩展自己的应用程序功能的模块)时,您将在代码中添加另一个模块。 默认情况下,您的代码不能被其模块使用,您必须在保护壳上戳孔以允许另一个模块访问您的代码。 从最低限制到最高限制封装代码的顺序如下: 大家 模组 文件 我可以解释,不要对所有经验丰富的开发人员大喊大叫。 您可以为类,结构和枚举提供五种不同类型的访问权限。 现在让我们仔细研究一下,然后按最有意义的顺序详细讨论它们。 开放存取 公共访问 内部访问-未指定时的默认访问级别 档案专用 私人的

Swift 2中的可选

满足可选。 你看过这些 在整个Foundation和UIKit中,您将看到很多可选的选项。 它表示有值或没有值的上下文。 在Objective中,您可以拥有一个可以指向某物的指针,或者为nil。 但是Optional使它更通用。 您现在可以使用“ Int”,UIImage?,String?,UIWindow? …` 可选类型的想法并不新鲜,您可能已经通过`data看到了它。Maybe a = Nothing | 在Haskell中只是一个`,在Rust中是枚举Option {None,Some(T)}`,在Java 8中是ʻOptional `,在C#中是“ System.Nullable ”,… 在Swift中,可选项全部与`?`和`!`有关。 后者是为懒惰的 可选的是枚举 实作 可选使用关联的类型枚举和泛型实现 宣言 当你看到 实际上是 检查 当你看到 实际上是 强制展开 您可以使用`!`来强制展开可选项。 如果没有值,它将崩溃“致命错误:在展开可选值时意外发现nil”。 实作 强制展开运算符`!`的实现方式如下 隐式展开的可选 可选是好的,但是每次使用时都需要检查其值 如果您确定Optional始终具有一个值,则可以使用!!来定义“ Implicitly Unwrapped Optionals”,这是一个可选选项,在您使用它时会自动将其值解包 隐式解包的Optionals是Optionals,因此您可以检查nil并使用可选绑定 选配 因为optional是一个枚举,所以我们可以有值和nil的集合 可选绑定 我们可以通过`if let`使用可选绑定。 更酷的是,Swift现在支持多个可选绑定 双选 Swift具有双重可选的特殊语法,即`??` Double可选也是此强制转换的结果 无合并运算符 >如果nil合并运算符(a ?? […]

开始Swift编程第3部分-运算符,可选和Nil值

在上一篇文章中,我们介绍了值类型,引用类型并以集合类型结束。 Swift编程入门第2部分—值类型,引用类型,指针和集合类型 之前,我们讨论过变量,常量和类型。 medium.com 今天,我们仍将继续介绍基础知识,但是好消息是在今天之后,您将能够编写一个解决您的数学问题的程序,无论是幼儿园的数学课程,还是使用公式进行的高级财务计算。 初步资料 您应该了解操作顺序(PEMDAS)的概念 如果数学课对您来说太早了,请按以下步骤操作: 括号(从内到外) 从左到右的指数 从左到右的乘法 从左到右划分 从左到右加法 从左到右的减法 而已! 经营者 只要达到三年级,您就已经在编程中看到了大多数操作员。 让我们看看您已经知道的那些。 加,减,乘和除的一种简便方法是将运算符追加到赋值运算符(您仍然可以使用加法运算符使用此方法来连接字符串)。 可选值和零值 好的,我将尝试使其变得容易,但可能会伤到您的大脑。 很好,这意味着您将学习。 当我谈到变量实例化和声明时,我希望您回想一下本系列的第一部分。 我有点掩饰了声明,而是给了您一些实例化新变量的例子。 我很抱歉,这只是为了让您免于一切,直到您准备好为止。 我们可以像这样声明变量

在Swift中是可选的(从示例开始)

在Swift中是可选的 Swift被设计为一种安全类型的语言。 随着Optional的引入,Swift解决了在Objective-C中变量可以为nil或不为null的问题,这使代码更加健壮和安全。 Optional就像一个盒子,您可以将普通类型(Int,String,object)放入盒子中,也可以将Optional本身放入盒子中。 var sz: String = “some string” sz = nil // compile-time error 尝试为sz分配nil时,上面的代码将弹出一个错误,错误消息: error: nil cannot be assigned to type ‘String’ 通过将变量sz作为可选类型,可以消除此问题。 var sz: String? = “some string” sz = nil // compile-time error

通过Nil-Or-Empty-Coalescing运算符(???)为空或不存在的可选项提供有意义的默认值

要解决此问题,我必须先打开可选包装,并检查它是否为nil或为空。 在这种情况下,我提供了一些有意义的默认值,例如,让用户知道他要查找的值当前不可用。 过去不久,我偶然发现了?? 运算符(顺便称为Nil合并运算符),它使您可以为nil的可选选项提供默认值。 但这不能解决可选不是null而是空的情况。 由于我不喜欢一遍又一遍地写相同的代码,只是稍微改变一下语法以反映变量名,所以我发现必须有一个更好的方法。 幸运的是,我们可以轻松扩展Optional并实现一个不错的功能来为我们做这件事。 我们只需要在扩展中编写一次解开代码,就不必再碰它了。 如果由于某种原因必须更改它,我们可以方便地在一个地方更改它,而不必经历整个项目,这确实很痛苦。 所以这里是: 那更好。 一个简单的函数,检查该值是nil还是空,并在这种情况下使用默认值。 但是,为什么我们要限制自己使用String? 使它成为各种可选功能的通用功能不是很好吗? 我认为是的,这就是为什么我更进一步。 当然,并非每个可选项都具有isEmpty属性。 字符串和数组都有它们,但是一个空的Int会是什么样子? 多数民众赞成在一个简单的解决。 我们可以使用isEmpty属性创建一个协议。 然后,我们可以限制我们的功能以查找实现上述协议的Optional。 如您所见,对于String和Array,我们甚至不需要实现某些东西,因为这些类型已经具有isEmpty属性。 现在,让我们以默认情况下没有isEmpty属性的类型实现我们的新成就,以查看它是否确实像我们期望的那样运行(我的意思是,无论如何,谁会信任计算机?) 哇,真棒。 真的行。 但是如果你像我一样,那你就是懒惰。 甚至可能是如此懒惰,以至于即使使用自动完成功能,键入“ orWhenNilOrEmpty”也已经非常费力。 当我意识到自己多么懒惰时,我想起了? 操作员。 您是否知道在Swift中可以编写自己的运算符? 当我在上面的代码上工作时,我偶然发现了这一点,这完全让我震惊。 对我来说,这是那些绝对幸运的事故之一,使我自己怀疑是否有巧合之类的事情。 这只是为了完美。 我必须立即尝试一下,这是我想到的: 我称它为“无或空”促销员,我很喜欢它。 我希望这一小部分内容可以帮助您编写更好的代码。 对我来说,这是一次很棒的学习经历。 在改进对Optional的理解的方式上(之前我从未关心过.some(wrapped)和.none,我实际上也不了解它们),我改善了对协议扩展和约束的了解,最后但并非最不重要的一点是,了解了如何编写自定义运算符。 我的建议是,每当发现自己编写相同或非常相似的代码两次以上时,就一定要研究是否存在更好的方法。

快速初始化

Swift已经引入了称为Optional的新型变量。 这些用于迅速保持零值。 由于存在这些变量,因此有关变量的初始化有一些更改。 这是相同的详细信息: 1.如果使用非可选属性,则必须快速启动初始化程序。 2.您需要先解开可选变量,然后再使用它们: 3.如果Property可以为nil,则使用? 属性之后,设置任何值之前: 4.如果在声明时解开属性,则可以直接使用它。 请注意,这不被认为是一种好的做法,因为它可能会在运行时导致崩溃。 5.在Swift新版本中,如果使用init方法,则需要实现initWithCoder方法。 6.在访问自身属性(例如视图)之前,必须在init和initWithCoder期间调用超类方法 。 7.您可以在调用超级方法之前创建对象,之后可以为该对象分配值: 8.您可以创建惰性属性,在惰性属性中,您可以在声明时分配值,但是只要我们使用该属性,就会执行Assign语句。 请注意,Lazy属性应始终使用var而不是let,因为常量在初始化之前必须具有值。 9.您可以使用Closure在惰性属性中添加任何逻辑。 您甚至可以在惰性属性中调用类OR实例方法 10.如果定义了任何自定义初始化程序,Swift会将它们区分为便捷初始化程序。 必须从便捷初始化程序调用任何默认的初始化程序(指定的初始化程序)。 需要修复如下:

値が自选な字典のnil値の取り扱い

今朝呟いた本件ですが,色々补足しつつ记事としてまとめました。 値が自选な字典とは? 値がOptionalなDictionaryとは例えば次のようなものを指しています(値がOptionalなことが大事なのでString型以外でも何でも良いです)。 var d = [String:String?]() 以下の糖衣构文ですが,上の简単な记述とするのが一般的なはずです。 var d = Dictionary <String,可选>() 倾向于として値が可选な词典を扱うのはなるべくやめた方が良いと思っている ,例えば以下のように非Optionalでも下标して取った结果はString?となります。 var d = [String:String]() 让x:字符串? = d [“ key”] もし値がOptionalだと,次のように取得结果がString?? ( Optional<Optional> )とOptionalのネストになってしまいます。 var d = [String:String?]() 让x:字符串? = d [“ key”] 词典の各种处理の戻り値自体がこのように任选ように返すものが多いため,値の型自体が任选だとややこしくなります。大抵抗は値の型自体を任选にすることなく词典が包含する任选だけますハンドリングできると思っています。 とはいえどうしても値を可选としたいこともありえるかもしれませんし,色々いじってたら面白かった,という次第です(・‿・`) ちょっと相对きが长くなりましたが,以下本题です。

Swift中的Optional的Optional

您是否知道可选内容本身可以包含一个可选内容,而该可选内容又包含另一个可选内容? 在这种情况下,我们需要多次拆开包装 当您尝试访问window时,通常会看到它 let window = UIApplication.shared.delegate?.window // UIWindow ?? 这是因为delegate可以为nil,其window也可以为nil。 window ??。backgroundColor = .yellow 原始故事https://github.com/onmyway133/blog/issues/58

在Swift中使用Optionals初始化枚举

今天有人给我看了medium.com/@_Easy_E/initializing-enums-with-optionals-in-swift-bf246ce20e4c,它试图用可选值初始化枚举。 枚举行星:字符串{ 汞盒 金星 案例地球 案例火星 木箱 土星 天王星 海王星 }扩展名RawRepresentable { 初始化?(optionalValue:RawValue?){ 保护让值=可选值else {return nil} self.init(rawValue:值) } } let name:字符串? =“金星” let planet = Planet(可选值:名称) 关于可选的一个有趣的事实是,它是一个monad,因此具有map和flatMap 。 由于enuminit(rawValue:)返回一个可选参数,因此我们需要使用flatMap 。 看起来像这样 让名字:字符串? =“金星” 让planet = name.flatMap({Planet(rawValue:$ 0)}) 原始故事https://github.com/onmyway133/blog/issues/49

Swift中的可选项(使用方法)

本文旨在回答以下问题:在Swift中解开可选控件的最佳方法是什么? 为了回答这个问题,我们将探讨实际上是什么可选参数,以及Swift为何使用它们。 然后,我们将考虑几种方法,您可能希望以一致的样式在代码中将它们展开。 让我们首先确认我们对什么是可选的理解:可选实际上是Swift中的一种特殊类型 ,它在其中包装了其他类型。 为了说明这一点,请考虑以下事实:类型为String和String? 实际上是Swift中的两种不同类型。 需要说明的是: 字符串肯定会是初始化的字符串,另一方面,“ 字符串?”实际上是Optional ,这是一种特殊类型,需要对其进行“包装”才能使用。 如我们所见,“ Swift的类型系统通常在包装类型的名称后加上问号(?),而不是显示完整的类型名称”(参考编号:F)。 在表面上, Optional类型是具有两种情况的通用枚举:Optional.none和Optional.some(Wrapped),用于存储包装的值。 从本质上讲,然后Optional类型就像一个盒子 ,可以包含一个值,也可以不包含任何内容(零) 。 非常类似于经典游戏,一个人试图在一组洗过的杯子下面找到一个球,直到您真正提起其中一个杯子并在杯子下面看一下,在杯子下面是否会有东西并不清楚。 在尝试表示可能尚未为其分配值或不存在值的对象(即可能不存在值的情况)时,可以在Swift中使用可选选项。 Swift创建了这个包装对象,该包装对象可能包含一个值,以便我们能够“ 拆开 ”该可选对象以访问其包含的值,或者在这种情况下, 它可能根本不包含任何值 ,如果我们不明智地尝试要“强制拆开”该选装件,将出现错误并可能崩溃(参考编号:C)。 C语言或Objective-C语言均未使用可选选项“ Objective-C中最接近的东西是能够从原本会返回对象的方法中返回nil的能力, nil意味着“缺少有效的对象”。 ,这仅适用于对象,不适用于结构,基本C类型或枚举值。 对于这些类型,Objective-C方法通常返回一个特殊值(例如NSNotFound )以指示不存在值。 这种方法假定方法的调用者知道要测试的特殊值,并且记住要进行检查。 Swift的可选参数使您可以指示任何类型都根本没有值,而无需特殊常量”(参考编号:C)。 “使用可选参数类似于在Objective-C中对指针使用nil ,但是它们适用于任何类型,而不仅仅是类。 可选参数不仅比Objective-C中的nil指针更安全和更具表达力,而且它们是Swift最强大的功能的核心”(参考编号:G)。 因此,在Swift语言中添加可选选项的论点集中在以下事实:它们强制执行良好的编程习惯(它们迫使程序员编写更明确的代码),并允许在编译时进行更好的代码检查(参考编号:L)。 “可选是Swift统一虚无表示的方式。 通过使用它们,我们失去了零消息传递的便利性和灵活性,但是获得了编译时检查,安全性以及处理相同问题的一致方法,而不论变量类型如何(参考编号:N)。 因此,从上面的内容中我们了解到,由于Optionals是一种特殊类型,并且基本上包含一个值或不包含任何值,我们不能直接使用它们,所以我们必须将它们拆开 (就像小时候一样,与您的新动作人物形象在圣诞节时一起使用,而无需先将其拆开)。 因此,让我们探索一下如何在代码中完成: 为了安全地解开可选选项,Swift社区中一种普遍且广受欢迎的方法是使用如下if let语句: 使用这样的方法称为“ 可选绑定”,因为我们创建了一个新属性,尝试将给定可选内容分配给该属性,但是如果不能(在上述示例中),我们将失败到我们的else语句。 安全解包的另一种方法是使用guard语句,例如,我们可以创建一个采用take和optional的函数,并使用guard let语句检查是否在传递给函数的optional中是否有任何内容: 如果里面没有什么可选项仍然可以,因为我们的警卫声明会掩盖我们的后背: 阻止导致问题的可选选项的一种聪明方法是通过“ nil-coalescing运算符” 提供默认值 ,或者在设置var或使其等于某些可选值(可能为nil)时在“ ??”之后放置默认值: 因此,如果Optional包含nil而不是由值填充,则可以使用此运算符为以后在代码中使用的内容提供默认值。 […]