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