Swift 字符串(x)放置“放”;“可选”;在输出中

Swift 字符串(x)放置“放”;“可选”;在输出中,swift,dictionary,Swift,Dictionary,我正在编写一个小程序,可以将文本文件读写到NSTableView中。我的阅读效果很好,然后开始写作。我得到了 FR Optional(0) Optional(0) Optional(0) Optional(0) Optional(46.29) Optional(0) 我理解为什么会发生这种情况:这些值是字典中的数字,因此根据定义,它们是可选的。但显然,这不是有用的输出 是否有一种简单的方法可以在不使用可选和任何类似bumpf的情况下输出值?如果您写入的值保存在一个(可选)数组中,那么在打印之前

我正在编写一个小程序,可以将文本文件读写到NSTableView中。我的阅读效果很好,然后开始写作。我得到了

FR Optional(0) Optional(0) Optional(0) Optional(0) Optional(46.29) Optional(0)
我理解为什么会发生这种情况:这些值是字典中的数字,因此根据定义,它们是可选的。但显然,这不是有用的输出


是否有一种简单的方法可以在不使用
可选
和任何类似bumpf的情况下输出值?

如果您写入的值保存在一个(可选)数组中,那么
在打印之前,flatMap
将为您提供帮助

// myOptionalDoubles : [Double?]
myOptionalDoublesForWriting = myOptionalDoubles.flatMap { $0 }
像这样使用
.flatMap
可以打开数组
myOptionalDoubles
中的任何非零值,并返回类型为
[Double]
的数组
MyOptionalDoublesOverwriting
(非可选)。
myOptionalDoubles
中的任何
nil
条目都不会跟随到
myOptionalDoublesOverwriting


如果您不想丢失有关可选条目的信息,可以改用
.map

// myOptionalDoubles : [Double?]
var myOptionalDoublesForWriting = myOptionalDoubles.map { $0 ?? 0.0 }

在这种情况下,可以使用展开每个(非
nil
)数组项,或者,如果它是
nil
,则为其指定值
0.0
。如上所述,映射到数组的MyOptionalDoublesOverwriting将是非可选类型
[Double]

之所以会看到可选(n),是因为您在打印可选内容时没有展开

我建议你重新阅读苹果书中的optionals一章,更好地理解为什么会发生这种情况

简短的版本是,一个可选的是一个类型,事实上,如果你看看Swift的源代码,你会发现它只是一个枚举

public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible {
    case None
    case Some(Wrapped)
    /// Construct a `nil` instance.
    public init()
    /// Construct a non-`nil` instance that stores `some`.
    public init(_ some: Wrapped)
    /// If `self == nil`, returns `nil`.  Otherwise, returns `f(self!)`.
    @warn_unused_result
    public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U?
    /// Returns `nil` if `self` is nil, `f(self!)` otherwise.
    @warn_unused_result
    public func flatMap<U>(@noescape f: (Wrapped) throws -> U?) rethrows -> U?
    /// Create an instance initialized with `nil`.
    public init(nilLiteral: ())
}
输出:

你明白了吗

看起来是这样的:

hello 
Optional("HELLO")
为什么第一个hello可以打印

因为它在
if let
语句中被展开

但是第二个,
大写
永远不会展开,因此可选的将仍然是可选的(除非展开)
code?.uppercaseString
返回一个新的可选值。通过直接打印,我们可以得到您看到的内容

如果要提取可选值所包含的值,则有两个运算符<代码>?和

通常首选第一个,但如果您确定该值正常,可以使用
强制展开,所以您可以

打印(大写!)


小心点,因为如果大写字母恰好为零,您将得到运行时崩溃

您使用什么代码来输出文本?我同意@Martin Marconcini。。。如果在变量后面加上“!”,请确保该变量永远不会变为零。如果它这样做,应用程序将崩溃!正如我在问题中提到的,我非常清楚为什么会发生这种情况。我正在寻找最简单的解决方案来处理可能为零的情况。数百个(字面上)if数据[“F3”]!=nil看起来像个傻瓜,将逻辑隐藏在代码下面。下面建议的.flatMap的缺点是隐藏哪些是nil,这仍然是有用的信息。一个完美的解决方案是“返回未包装的值或零”。我理解你的意思,但你问:“有没有一种简单的方法可以输出值,而无需可选和任何类似的凹凸”。是的,您可以使用可选的展开进行打印。您真正想要的似乎是打印值,而不考虑其内容,如果一个值恰好为零,则将其替换为零。这一点在原问题中没有说明。不管怎样,我现在身边没有游乐场,但是其他用户给出的解决方案可能会起作用(map)。虽然我认为他的语法是错误的,但它更接近于
map{$0.1??0.0}
,但我还没有测试过它。“myOptionalDoubles中的任何nil条目都不会跟随myOptionalDoublesForWriting。”好吧,所以我认为扩展它可能一举两得。。。我遇到的另一个问题是,行中“左边”的任何nil条目都必须插入占位符“0”。所以这…@MauryMarkowitz:一开始误解了你的评论。添加了一个使用
.map()
选项的示例,插入零而不是删除这些条目。这正是我想要的。谢谢dfri@MauryMarkowitz不客气。圣诞快乐!:)
hello 
Optional("HELLO")