String(x)put" optional"在输出中

时间:2015-12-23 22:15:42

标签: swift dictionary

我正在编写一个程序,可以将文本文件读取和写入NSTableView。我的阅读工作正常,然后转到写作。我得到了......

FR Optional(0) Optional(0) Optional(0) Optional(0) Optional(46.29) Optional(0)

我理解为什么发生这种情况:值是字典中的NSNumbers,因此根据定义,它们是可选的。但显然这不是有用的输出。

是否有 easy 方式输出没有Optional和任何类似的bumpf的值?

2 个答案:

答案 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]