我是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
将是true
或false
。因此,上述样本的含义是不正确的,因为它隐含地声称如果安全地解开,那么该值始终为真。
以下是一些解释我在说什么的例子:
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是否需要更改此特定示例。
答案 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混为一谈。他们不一样,虽然在某些情况下,他们的行为就像是假的。