我有一个简单的代码,我尝试将数字分成数字:
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)]
我做了一些关于“可选”的研究,并发现这个术语与包装/展开值有关,但要完全理解这一点我需要有人在我自己的代码上解释这个。所以,我的问题是:为什么我的代码中出现了可选值以及如何摆脱这种意外输出? 另外,我想知道是否有任何方法可以将此代码编写为“更好”(即更具可读性)?
答案 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;它可以包含value
或nil
。
某些操作将直接返回值(因为它不可能是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)
}