Tag: 可选

Swift中的通用可选处理

有时,您希望编写一种适用于任何Optional类型的通用算法,无论包装在里面的是哪种实际类型。 好的,这可以使用免费的泛型函数轻松完成,但是例如,如果要编写Sequence扩展以删除所有nil值怎么办? 由于Optional不是协议而是具体类型,因此事情变得有点复杂,因此不能将其用作通用类型约束。 Swift中的通用协议和具体类型具有不同的用途:我们创建实例并声明具体类型的变量,而协议则可以用作通用类型约束。 类型擦除是一种在我们要声明一个能够容纳符合特定协议的任何具体类型的变量时使用的技术。 相反,我们想要的是同一难题的另一部分,我们需要一个协议,允许我们将具体的泛型用作约束。 用英语听起来这听起来很复杂,但通常情况下,用普通的Swift编写起来看起来要简单得多。 因此,这里我们只定义一个OptionalType协议,声明WrappedType关联的类型,并使Optional枚举符合该类型。 请注意,泛型类型参数不会自动满足协议要求,但是这里我们有类型推断。 为了使该协议有用,我们公开了一些基本的Optional功能: asOptional属性使我们可以访问可选的绑定语法。 ExpressibleByNilLiteral一致性允许我们使用nil进行初始化。 完成之后,我们现在可以将OptionalType用作一般约束: 如果您正在寻找可以使用Optional枚举完成的更多技巧,则应查看Russ Bishop撰写的精彩文章。

可选的ve解包

Merhaba sevgili TurkishKitokuyucaları。 👋🏼Bugünkükonumuzda kod yazarkensüreklikarşımızaçıkan(!)ve(?) 哈迪başlayalım! 可选的Nedir吗? Birçokyazılımdilini birbirindenfarklıkılanbir yan bulunur。 Swift dilinidiğerdillerdeneşsizkılanözelliklerdenbiri de“ Optional”kavramı。 Swift dilindedeğişkenve sabitler可选olaraktanımlanabilir。 可选的KavramınaNedenİhtiyaçDuyarız吗? Swift dilinde sabit vedeğişkenleri可选olaraktanımlayabileceğimizdenbahsettik。 您可以在互联网上下载互联网,也可以在其他网站上随意选择。 Çénükü互联网ten veri gelipgelmeyeceğinibilemeyiz。 Daha Basit Bir Dil ileAnlayalım Örnek1 —Önümüzdebir kutu var。 Bu kutununiçinidoldurabileceğimizgibiboşdabırakabiliriz。 Bu tamamen bizimseçimimizdir。 Örnek2-比兹·比尔·库图·盖蒂尔迪 Bu kutununiçiboşya da dolu olabilir。 Bu tamamenkarşıtarafınseçimidir。 可选的DeğişkenTanımlama Xcode’dan yeni bir游乐场Projesiaçabilirsiniz。 照片:gibitanımlıyoruz: […]

在Swift中处理非可选选项

可选参数可以说是Swift最重要的功能之一,也是将其与Objective-C之类的语言区分开来的关键。 通过被迫处理可能 nil ,我们倾向于编写更具可预测性和较少错误的代码。 但是,有时可选参数会使您陷入困境,因为程序员如您所知(或者至少您是在这种假设下 ),即使使用某个变量,某些变量也总是非零。可选类型。 就像在视图控制器中处理视图时一样: 在这种情况下,Swift程序员将在几乎与制表符和空格相同的程度上存在分歧。 有人说: “由于它是可选的,因此您应该始终使用what或guard let适当地解开它。” 而其他人会朝完全不同的方向说: “由于您知道该变量不会为nil,请强制将其解包(使用!)。 崩溃比最终处于不确定状态要好。” 基本上,我们在这里谈论的是是否进行防御性编程。 我们是否试图从不确定的状态中恢复,还是仅仅放弃并崩溃? 如果我不得不对这个问题给出一个二进制答案,那么我绝对会选择后者。 未定义状态会导致很难发现错误,可能会导致不必要的代码执行,而采用防御性编程只会导致难以推理的代码。 但是,我宁愿不必给出二进制答案,而是研究一些可用于以更细微的方式解决此问题的技术。 让我们潜入吧! 真的可选吗? 变量和属性是可选的,但实际上是程序逻辑所必需的,实际上是体系结构缺陷的征兆。 如果需要某些东西,直到没有它会使您处于未定义状态–它不应是可选的。 尽管在某些情况下(例如与某些系统API进行交互时),确实很难避免使用可选选项-在许多情况下,我们可以使用某些技术来摆脱可选选项。 懒惰胜于非可选的 一种避免使用属性的可选选项的方法是通过使用惰性属性,该属性需要在创建父对象之后创建值(例如,视图控制器中的视图,应在loadView()或viewDidLoad() )。 惰性属性可以是非可选的,但仍不需要在其父级的初始化程序中创建。 它将在首次访问时创建。 让我们从之前更新TableViewController ,以为其tableView使用惰性属性: 没有可选项,没有不确定的状态! 🎉 适当的依赖项管理比非可选的可选项更好 可选项的另一个常见用法是打破循环依赖关系。 有时您会遇到A依赖于B ,但B也依赖于A 。 像这样的设置: 正如我们在上面看到的,我们在UserManager和CommentManager之间具有循环依赖关系,其中它们都不假定彼此拥有所有权,但是它们在逻辑上仍然CommentManager 。 那只是等待发生的错误! 😅 为了解决上述问题,我们改为让CommentComposer充当中间人,并负责通知UserManager和CommentManager已经作出评论: 这样, UserManager可以保留对CommentManager的强引用,而无需任何保留(或依赖)周期: 我们再次删除了所有可选内容,并提供了可预测的代码! 🎉 优雅地崩溃 在上面的示例中,我们看到了一些示例,在这些示例中,我们可以调整代码以通过删除可选项来消除不确定性。 但是,有时这是不可能的。 假设您正在加载包含应用程序配置的本地JSON文件。 这本质上是一个可能失败的操作,因此我们将需要添加一些错误处理。 如果配置无法加载,则继续执行程序会使应用程序处于未定义状态,因此在这种情况下最好崩溃。 这样,我们可以获得崩溃报告,并希望我们的测试和质量检查流程能够早于解决此问题并将其送达用户。 […]

Swift —可选的初始化

因此,您正在尝试使用可选常量创建自己的类吗? 谜 如果您是像我这样的Swift菜鸟,那么第一次尝试在类中使用一些Optional类型常量创建Swift类时,就会遇到此错误。 现在,您可能会说:“等等,我从未遇到此错误,因为我总是像所有理智的人一样初始化所有的类属性。” 啊哈! 我亲爱的想象中的理想程序员,最初的挫败感是这样的。 在Swift中必须启动其他所有类型的原因是,否则它们将具有nil值。 但是,Swift中的Optional类型可以为nil 值,我们在代码中按原样处理它们。 因此,我的推论是,Swift中的Optional类型应该可用而无需初始化。 另外,如果您使用可选类型变量而不是可选类型常量 ,则代码将完美编译,如下所示。 那么这是怎么回事? Swift为什么让我们使用未初始化的Optional类型变量而不是常量? 处理Optional类型时,Swift变量和Swift常量之间有什么区别? 揭示 变量和常量之间存在差异的原因是,Swift 变量可以隐式处理显式设置的值,而Swift 常量 每次都需要显式设置其值。 Swift中的每个类型(例如String,Int,Bool等), 除了Optional之外,都具有显式的 .None值。 但是Swift中的Optional类型具有隐式 .None值。 这意味着,对于Swift中的任何变量或常量(Optional除外),该值将显式设置为.None ( nil )。 但是,对于Swift中的任何Optional变量或常量,该值均隐含为 .None ( nil ),即,该值可以为nil但并不总是nil 。 现在,如上所述,Swift中的变量知道如何处理值的显式和隐式分配。 因此,一个类变量可以从Optional类型推断其初始值,即.None 。 但是, 常量不知道如何处理隐式值,因此无法从Optional类型推断出它的初始值(需要明确地说,“这是您的初始值”)。 结论 Swift中的类变量无需初始化即可处理Optional类型(因为它们可以处理隐式.None值),但是Optional类型的类常量将始终必须被初始化(因为它们无法处理隐式.None值,并且需要显式设置一个值)。 本文是在以下资源的帮助下撰写的: Swift可选的初始化 感谢您为Stack Overflow提供答案! 请务必回答问题。 提供详细信息并分享… stackoverflow.com 是nil和Optional。在Swift中没有相同的东西吗? 感谢您为Stack Overflow提供答案! 请务必回答问题。 提供详细信息并分享… stackoverflow.com

Swift中的可选-了解原因

Swift带有可选和非可选变量的新概念。 在回答为什么是可选的? ,您需要快速了解什么是可选的? var someOptionalString:字符串? // 可选的 var nonOptionString:String =“ 123” //非可选 那是? 在声明中意味着什么? 好吧,这是一种快速声明可选变量的方法。 好。 但是,这是什么可选内容? 可选的是一种表示变量中是否有值或什么都不表示(即没有值)的方法。 从上面的代码, someOptionalString可选变量,我们可以得出结论,它可以包含一些字符串值,也可以根本不包含任何字符串值。 迅速地, nil是一个特殊值,表示没有值。 因此, someOptionalString可以包含字符串值,也可以为nil 。 好。 到目前为止很清楚。 但是为什么是可选的 ? 让我用示例解释一下: -(NSString *)getFormattedPhone:(NSString *)phone { 如果(phone.length == 10){ NSString * countryCode =“ +91” 返回[NSString stringWithFormat:@”%@-%@”,countryCode,电话] } 返回零; } NSString * formattedPhone = [self getFormattedPhone:@” 2233231341223“]; //返回nil […]

Swift-什么是可选绑定? (?/!)🚨

大家好,😛,我们今天将在Swift中讨论“ 可选绑定 ”。 可选绑定是一个让人头疼的话题,但您可以! 我们将尽可能简单地描述所有内容,所以不要害怕😇 我们的主要符号是“?”,用于将变量定义为Optional 。 (这意味着可以为零 )让我解释一下, 我们已经将movieCount变量定义为Optional 。 如果需要检查moviesCount的值,则必须解开变量。 您可以通过其他方法来完成此操作,请允许我解释一下。 1 –强制展开 您可以使用“!”运算符解开Optional变量,但这是一种不太安全的包装方式,必须确保变量是否包含值。 如果未在正确的地方使用强制展开方法,则应用程序可能会崩溃。 👿 我的视图控制器上有一个按钮,该按钮已连接到IBOutlet 。 但是,如果我们断开它们的连接, 将会发生什么? 如果您尝试在初始化我们的隐式可包装可选变量之前进行某些突变。 您的应用程序可能崩溃了。 🤑 我认为一切都清楚了。 如果您有任何疑问或反馈,请尝试通过评论或Twitter与我联系:@ strawb3rryx7 感谢您的阅读,广为传播。 👏🏼

零销售员

为什么最简单的概念有时会具有最复杂的名称? 听起来有些吓人,但是nil-coalescing运算符实际上非常简单! 假设您有一个可选的name -我们称其name : var名称:字符串? 假设您要在标签中显示名称。 如果名称等于nil,则希望标签显示默认值“匿名”。 解决方案1 :首先检查name包含值。 如果是这样,则显示该值。 否则,显示“匿名”。 就像是: 如果名称!= nil { //我们可以“强制展开”名称,因为我们知道它包含一个值: label.text =名称! }其他{ label.text =“匿名” } 解决方案2:通过将name可选变量绑定到保证不包含nil的新变量, 可选绑定将使它更漂亮,例如: 如果让名称=名称{ //使用可选绑定,无需强制解包 label.text =名称 }其他{ label.text =“匿名” } 解决方案3:三元条件运算符 (一个简单的概念,还有一个令人生畏的名字!)是在if语句中的一种捷径。 如果if语句的基本语法是: 如果条件{ 一种 }其他{ b } 然后,三元条件运算符将此语法简化为: 条件? a:b 我们可以应用此公式将解决方案1简化为: label.text =名称!=无 名称! :“匿名者” 现在更好了,我们的五行代码减少到只有一行! 如果名称具有值,则将其强制展开,否则将使用默认值“匿名”。 不过,它看起来仍然有些混乱,并且可能需要一些时间来了解正在发生的事情。 一个更简单的解决方案是使用nil-coalescing运算符 ! 解决方案4: […]