映射后可选

时间:2018-03-21 11:41:31

标签: arrays swift optional

我有一个简单的代码,我尝试将数字分成数字:

for n in 10...12
{
    let numberIntoString = String(n)
    let splitNumber = Array(numberIntoString)
    let charIntoString = splitNumber.map {String($0)}
    let numberIntoInteger = charIntoString.map {Int($0)}

    print(numberIntoInteger)   
}

,输出为:

[Optional(1), Optional(0)]
[Optional(1), Optional(1)]
[Optional(1), Optional(2)]

我做了一些关于“可选”的研究,并发现这个术语与包装/展开值有关,但要完全理解这一点我需要有人在我自己的代码上解释这个。所以,我的问题是:为什么我的代码中出现了可选值以及如何摆脱这种意外输出? 另外,我想知道是否有任何方法可以将此代码编写为“更好”(即更具可读性)?

3 个答案:

答案 0 :(得分:0)

该行

let numberIntoInteger = charIntoString.map {Int($0)}

生成一个可选项。这是因为如果提供的String不是数字,则将Int转换为Int($0)String)可能会失败。例如,"abcde"不是数字,无法转换为Int。因此,将返回nil。这是完全可以预料到的,并不像你说的那样出乎意料,Int初始化程序的设计是这样的。

您可以通过隐式解包来删除Optional值,如下所示:

let numberIntoInteger = charIntoString.map {Int($0)!}

请注意初始化程序后的!。这将删除可选项。但是,如果值实际为nil,则程序将崩溃。在您的情况下,这绝不应该发生,因为n应该只是Int

您还有另一种选择:使用flatMap 请注意,这在Xcode 9.3 Beta中已弃用,请改用<{1}}

compactMap

答案 1 :(得分:0)

一个可选项可以被视为一个&#34;框&#34;它可以包含valuenil

某些操作将直接返回值(因为它不可能是nil)。情况如下:

String(n)

但是,其他一些操作将返回box(可选),因为它可能是nil。情况如下:

Int($0)

例如,如果您尝试Int(""),您将获得nil

您的示例解决方案

使代码更具可读性(并摆脱这些Optionals)的一种可能方法可能是:

for n in 10...12
{
    let numberIntoString = String(n)
    let numberIntoInteger = numberIntoString.flatMap{Int(String($0))}

    print(numberIntoInteger)
}

答案 2 :(得分:0)

问题已经回答了 - Int(*string*)初始化程序返回一个可选项 - 这是一个摆脱可选内容的建议。

代码用数字来分割数字(当然它只适用于从0到99的值)

for n in 10...12
{
    let numberIntoInteger = [n / 10, n % 10]
    print(numberIntoInteger)
}