Swift 3.0可选链接

时间:2016-07-14 08:52:58

标签: swift

我是swift的新手,所以这绝对是一个新手级别的问题。我正在思考一些Swift 3.0文档,我注意到了一个潜在的错误。我想知道这个例子是不正确的(或含糊不清的),或者我实际上错过了某些准则。

请参阅http://swiftdoc.org/v3.0/type/Optional/有关可选链接的部分。

  

可选链接

     

要安全地访问包装实例的属性和方法,请使用postfix可选链接运算符(?)。以下示例使用可选链接访问hasSuffix(_:)实例上的String?方法。

if let isPNG = imagePaths["star"]?.hasSuffix(".png") {
    print("The star image is in PNG format")
}
// Prints "The star image is in PNG format"

AFAIU,imagePaths["star"]?.hasSuffix(".png")只应在imagePaths导致hasSuffix()的情况下安全展开imagePaths["star"]并运行Optional.some(wrapped)。这意味着isPNG将是truefalse。因此,上述样本的含义是不正确的,因为它隐含地声称如果安全地解开,那么该值始终为真。

以下是一些解释我在说什么的例子:

if let isPNG = imagePaths["star"]?.hasSuffix(".png") {
    print("The star has png format")
} else {
    print("The star does not have png format")
}

if let isPNG = imagePaths["portrait"]?.hasSuffix(".png") {
    print("The portrait has png format")
} else {
    print("The portrait does not have png format")
}
// "The portrait has png format\n"

if let isPNG = imagePaths["alpha"]?.hasSuffix(".png") {
    print("The alpha has png format")
} else {
    print("The alpha does not have png format")
}
// "The alpha does not have png format\n"

我只是想知道我目前的分析是否错误,或者SwiftDoc.org是否需要更改此特定示例。

2 个答案:

答案 0 :(得分:6)

您的分析是正确的,SwiftDoc.org上的示例至少是这样 误导性,如下面的代码所示:

let imagePaths = ["star": "image1.tiff"]

if let isPNG = imagePaths["star"]?.hasSuffix(".png") {
    print("The star has png format")
} else {
    print("The star does not have png format")
}

// Output: The star has png format

如果

,则可选绑定成功
imagePaths["star"]?.hasSuffix(".png")

不是nil,即如果可以执行可选链接, 即imagePaths["star"] != nil

测试所有情况的正确方法是

if let isPNG = imagePaths["star"]?.hasSuffix(".png") {
    if isPNG {
        print("The star has png format")
    } else {
        print("The star does not have png format")
    }
} else {
    print("No path in dictionary")
}

当然,这可以通过各种方式简化(零合并运算符,模式匹配......)。例如

switch(imagePaths["star"]?.hasSuffix(".png")) {
case true?:
    print("The star has png format")
case false?:
    print("The star does not have png format")
case nil:
    print("No path in dictionary")
}

let isPNG = imagePaths["star"]?.hasSuffix(".png") ?? false

(问题评论中的更多例子。)

答案 1 :(得分:-3)

我相信你正在将选项与Bool混为一谈。他们不一样,虽然在某些情况下,他们的行为就像是假的。