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 ?? b)包含值,则将其解开;如果a为nil,则返回默认值b。

`??`的右手实际上是一个闭包

可以链接

它也适用于字符串插值

这样实现

可选链接

可选参数可能为nil,因此查询其方法,属性,下标将返回另一个可选参数

可选代表

委托可能为nil,并且可能未实现可选方法。 因此,在调用它时必须使用`?`

可选的回调

回调可能为nil

可选模式

>新的可选模式myValue?等价于.Some(myValue)的可选选项

如果您有可选的枚举

你可以要求情况

您可以要求与案件相关的价值

当然,它也可以和`switch`一起使用

>可选模式匹配在Optional 或ImplicitlyUnwrappedOptional 枚举的Some(Wrapped)情况下包装的值

这些是等效的

>可选模式提供了一种方便的方法,可循环访问for-in语句中的可选值数组,仅对非null元素执行循环主体。

有`as?`和`as!`,请参见[Swift 2中的类型转换](http://www.fantageek.com/blog/2015/09/23/type-casting-in-swift/)

初始化器

初始化失败

>失败的初始化程序会创建一个初始化类型的可选值

Swift也支持`init !! 初始化失败

尝试执行可能抛出的操作,如果成功,则返回包含返回值的可选内容。 `try!`也一样,但是您得到了一个隐式解包的可选

功能可选

可选的是函子,应用函子和monad

请注意,所有这些方法都是作为Optional的扩展实现的,请参阅我的[gist](https://gist.github.com/onmyway133/48c969c8baf4e7e77ee0)

地图

>如果self == nil,则返回nil。 否则,返回f(self!)。

这样实现

flatMap

>如果self为nil,则返回nil,否则返回f(self!)。

让我们使用`countCharactersIfNotEmpty`,该函数在收到空字符串时返回nil。 是的,它不喜欢空字符串

这样实现

地图与平面地图

注意在map中,f的类型是Wrapped-> U,而在flatMap中,f的类型是wrapped -U。

如果将`map`与`Wrapped-> U?`一起使用,则会获得double可选

也可以使用map + flatten来实现flatMap,因此命名为flatMap。 如您所知,它称为“强制展开”

应用

这是Optional像应用函子一样的工作方式,请注意`f`是`(Wrapped-> U)类型?

这就是它的实现方式

参考

– [选项类型](https://en.wikipedia.org/wiki/Option_type)
– [Swift 2:控制流模式匹配示例](http://austinzheng.com/2015/09/23/pmatch-control-flow/)
– [在类固醇上实施“ try?”和“ try!”的印刷版本! 在#swiftlang中](http://ericasadun.com/2015/11/05/implementing-printing-versions-of-try-and-try-on-steroids-in-swiftlang/)
– [如果可以,请与我联系:详细的Swift模式匹配](http://appventure.me/2015/08/20/swift-pattern-matching-in-detail/#sec-4-1)
– [什么是Swift中的Optional](http://www.drewag.me/posts/what-is-an-optional-in-swift)
– [Swift 2.0:地图和FlatMap揭秘](http://www.uraimo.com/2015/10/08/Swift2-map-flatmap-demystified/)
– [Swift Optionals的地图和FlatMap的功能](http://blog.xebia.com/the-power-of-map-and-flatmap-of-swift-optionals/)
– [Functor and Monad in Swift](http://www.javiersoto.me/post/106875422394)
– [图片中的快速函子,Applicatives和Monads]​​(http://www.mokacoding.com/blog/functor-applicative-monads-in-pictures/)
– [与Swift的可选模式匹配](http://www.figure.ink/blog/2015/12/6/matching-with-swifts-optional-pattern)