我正在编写一个程序,可以将文本文件读取和写入NSTableView。我的阅读工作正常,然后转到写作。我得到了......
FR Optional(0) Optional(0) Optional(0) Optional(0) Optional(46.29) Optional(0)
我理解为什么发生这种情况:值是字典中的NSNumbers,因此根据定义,它们是可选的。但显然这不是有用的输出。
是否有 easy 方式输出没有Optional
和任何类似的bumpf的值?
答案 0 :(得分:2)
您看到Optional(n)的原因是您打印可选项而不解包。
我建议你重新阅读Apple书中的选项章节,以便更好地掌握为什么会发生这种情况。
短版本是,一个可选类型,实际上如果你看一下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: ())
}
因此,如果您的值是Optionals,则必须打开它们以查看其值。
看看这段代码并尝试猜测输出:
var code: String? = "hello"
if let code = code where code == "hello" {
print(code)
}
var upperCase = code?.uppercaseString
print(upperCase)
输出:
你明白了吗?
看起来像这样:
hello
Optional("HELLO")
为什么第一个问候打印好吗?
因为它正在if let
声明中展开。
但是第二个,upperCase
永远不会被打开,所以一个Optional将保持可选(除非打开)。 code?.uppercaseString
返回一个新的Optional。通过直接打印,我们得到你所看到的。
如果要提取可选项所持有的值,则有两个运算符。 ?
和!
。
第一个通常是首选,但如果您确定该值正常,则可以使用!
强制解包,这样就可以了
print(uppercase!)
小心点,因为如果upperCase恰好为零,则会出现运行时崩溃。
答案 1 :(得分:1)
如果您编写的值保存在(可选)数组中,那么在打印之前.flatMap
将为您提供技巧
// myOptionalDoubles : [Double?]
myOptionalDoublesForWriting = myOptionalDoubles.flatMap { $0 }
像这样使用.flatMap
,解包数组myOptionalDoubles
中的所有非零值,并返回类型为myOptionalDoublesForWriting
的数组[Double]
(非可选)。 nil
中的所有myOptionalDoubles
条目都不会跟随myOptionalDoublesForWriting
。
如果您不想丢失有关可选条目的信息,可以改为使用.map
:
// myOptionalDoubles : [Double?]
var myOptionalDoublesForWriting = myOptionalDoubles.map { $0 ?? 0.0 }
在这种情况下,您可以使用 nil coalescing operator 打开每个(非nil
)数组条目,或者,如果它nil
,给它值0.0
。如上所述,映射到数组myOptionalDoublesForWriting
将是非可选类型[Double]
。