可选类型的扩展
嘿大家! 我想写这篇简短的文章,因为我喜欢使用这种技术,它并不是最明显的实现。 因此,如果您在Swift中工作了2分钟以上,那么您可能已经看到Optional了 。 有很多很棒的文章解释了这些东西是什么以及如何使用它们。 我不会在这里讨论。 我想说的是恐惧
表达式从“字符串”隐式强制转换 去任何'
每次尝试打印Optional时出现的错误。 好的,这不是世界上最重要的用例,但是如果没有它,您的代码将被警告打乱,或者每次执行此操作时都必须将所有内容转换为Any
类型。 所以下面的实现:
let val:字符串? =无
// ...
print(val)//警告在这里生成
会成为
let val:字符串? =无
// ...
print(val as Any)
如果您有很多这样的事情,或者如果val的类型发生变化,那么这将成为一场噩梦。 因此,什么是优雅的修复程序,因为它绝对没有使用String(describing: val)
,这是Xcode中建议的修复程序。 我很高兴你问😁。 为了解决这个问题,让我们在Optional
类型上编写一个扩展名,是的,这是完全可能的,而且非常酷! 让我们开始编写以下代码:
扩展名可选,其中Wrapped ==字符串{}
在上一个代码块中,我们扩展了Optional
类型,其中Wrapped
类型是String
。 Wrapped
属性是使用Optional
声明(Swift Generics)声明的泛型类型的标识符。 这意味着我们在此扩展中编写的任何代码仅可用于可选的字符串类型( String?
)。 因此,让我们实现我们的扩展。 在下一个代码块中,我们将添加一个名为valueOrEmpty
的新属性。 这是代码:
扩展名可选,其中Wrapped ==字符串{
var valueOrEmpty:字符串{
守卫让自己解开=自我否则{
返回“”
}
退回包装
}
}
首先,我们将可选组件与其他可选组件一样用保护罩展开。 然后,如果该值存在,则返回它,否则,我们返回一个空字符串。 现在,这如何影响早期的代码? 现在,我们将拥有以下内容,而不是强制转换为Any
类型:
let val:字符串? =无
// ...
打印(val.valueOrEmpty)
这使我们可以将可选字符串转换为非可选字符串,其中该字符串将具有值或为空。 如您所知,这不仅可以应用于字符串和输出值,还可以应用于许多其他方面。
当我想比较两个布尔值(其中一个或两个都是可选的Bool
时,已经跳了多次。 如果值nil
,我们可以创建一个扩展名给我们false。 这很可能是一个安全的假设,因为如果bool的值为nil,我们希望执行if或guard语句的失败案例。 这将我带到了最后一点。
拥有权利的同时也被赋予了重大的责任
它可以用于各种各样的事情,您可能会发疯。 但是请记住,在我们的代码中,可选实际上是一件很棒的事情。 当我使用其他语言时,意外地得到了一个空指针异常,我想把头发扯下来,因为没有可选的选项(看着您的Java,您知道自己做了什么)。 这不应该用于绕过所有可选对象 。 在很多情况下,可选的选项是必要且良好的。
好了,既然我的PSA已经结束,希望这篇快速的文章揭示了一些您可以在代码中编写的出色扩展。 感谢您的阅读! 😁
Github
- https://gist.github.com/Ericdowney/59d33f53677bbe9ef11227716b1b03b3
版本号
- Xcode 10 beta 6 —游乐场
- 斯威夫特4.2
参考文献
- https://docs.swift.org/swift-book/LanguageGuide/Generics.html